0

ライブラリは、テンプレート引数として派生クラスを使用して派生するクラスを提供します。

例:

class userclass : public lib::superclass<userclass>
{}

ご覧のとおり、入力するのはかなり多いです。また、「ユーザークラス」は、正しく機能するために常にパブリックとして派生する必要があります。だから私はこのように見える2つのMACROを思いついた:

#define SUPER(x) public lib::superclass<x>
#define SUPERCLASS(x) class x : public lib::superclass<x>

ユーザーはいずれかを入力できるようになりました。

class userclass : SUPER(userclass)
{}

SUPERCLASS(userclass)
{}

しかし、主な問題は、マクロ SUPER および SUPERCLASS が、ヘッダーが含まれるのと同じ速さでユーザーのグローバル名前空間に存在することです。

できる/すべき:

  1. 名前空間の要件を維持しながら、パブリック派生をデフォルトにする方法はありますか?
  2. マクロはそのまま使用してください。
  3. ユーザーに完全な「public lib::superclass」を書き出すよう要求するだけです。

私はvs 11を使用しており、ライブラリはWindows開発者を対象としています。

4

3 に答える 3

6

マクロを使用する最初のルールは、「他に解決策がある場合は使用しない」です。この場合、別の解決策があるので、それらを取り除きます。

第二に、あなたのマクロは良いどころか害を及ぼします。なぜなら、完全な定義は理解できるのに対し、マクロを読んだだけでは何に展開されるかわからないからです。真剣に、あなたは読みやすさの本当に恐ろしいコストのために、本当にごくわずかな数の文字を節約しています. 継承を単純に書き出すよりもはるかに優れています。

于 2013-02-02T12:41:56.973 に答える
2

それは実際に入力することはあまりありません。短くしてはいけない長い行をたくさん見てきました。マクロで非表示にすると、コードが難読化されます。あなたの をざっと見てみるとSUPERCLASS(userclass) {}、それがクラスであるとほぼ推測できます (推測に基づいてライブラリを使用するのは好きではありません) が、それまたはその親が呼び出されているかどうかuserclass(またはどちらも呼び出されていないか) はわかりません。使用している継承の種類。つまり、それを文書化する必要があり、人々が必要なときにそれを調べるように強制するということです。

したがって、正解はオプション 3 です。マクロを使用しないでください。

ライブラリでマクロを使用する必要がある場合は、ライブラリ固有の接頭辞を付けてください。これは、名前空間を持つマクロに近づくのと同じくらいです。

于 2013-02-02T12:42:45.923 に答える
0

私は 3 に投票します。ユーザーに完全な "public lib::superclass" を書き出すよう要求するだけです。

ライブラリ内のマクロは、次の場合に役立ちます。

  • 書くことは本当にたくさんありますが、
  • 何かを何度も書かなければならない
  • または、醜い実装の詳細を隠したいのですが、言語ではそれ以外のことはできません。

しかし、あなたの場合:

  • 書くことはあまりないので、
  • はい、クラス名を 2 回入力する必要があります。
  • サブクラス化しているという事実、またはクラスを作成しているという事実さえ隠したくありません!

クラス名の重複 - 1 つの肯定的な点 - は価値があるとは思いません。特に、classキーワードを非表示にして、読者にかなりの混乱を引き起こすためです。

とにかく、ライブラリがマクロを使用している場合、ライブラリ名をすべてのマクロの前に置くのが通例です:

#define MY_FANCY_LIBRARY_NAME_SUPER(x) public lib::superclass<x>

しかし今、あなたはそれほど多くのタイピングを節約していません...

PS: プログラミングの黄金律を思い出してください。

コードは一度書かれれば永遠に読まれます。

于 2013-02-02T12:46:07.280 に答える