10

ヘッダーのクラスごとに一意の番号を生成したいのですが、私の場合は素数ですが、これは連続した番号、つまり1、2、3、4などである必要があるとしましょう。

もちろん、これらをハードコーディングすることもできます。

struct A { enum { ID = 1; }; };
struct B { enum { ID = 2; }; };
struct C { enum { ID = 3; }; };
struct D { enum { ID = 4; }; };

実際にはクラスはそれほど小さくないため、これは非常にエラーが発生しやすく、IDの概要を完全に失いたくない場合は、途中で新しいクラスを追加する場合、次のすべての番号を変更する必要があります。

次のことができたらいいのにと思います。

struct A { enum { ID = get_next_int(); }; };
struct B { enum { ID = get_next_int(); }; };
struct C { enum { ID = get_next_int(); }; };
struct D { enum { ID = get_next_int(); }; };

ただし、constexpr関数の呼び出しには副作用がないため、これは不可能です。そのような結果をマクロで使うことも不可能だと思います。

私もそのようなもので幸運だろう:

struct A_id_holder : some_base_counter {};
struct A { enum { ID = A_id_holder::ID; }; };

struct B_id_holder : some_base_counter {};
struct B { enum { ID = B_id_holder::ID; }; };

struct C_id_holder : some_base_counter {};
struct C { enum { ID = C_id_holder::ID; }; };

struct D_id_holder : some_base_counter {};
struct D { enum { ID = D_id_holder::ID; }; };

しかし、正直なところ、それを実装する方法がわかりません。

目標を達成できますか?達成した場合、どのように達成できますか?

4

4 に答える 4

4

Boost プリプロセッサ ライブラリがそれを行うことができると思います。おそらくそれを読む必要があります: C プリプロセッサで一意の値を生成するにはどうすればよいですか?

使用しているコンパイラに応じて代替手段があります。gcc と msvc には、連番を許可する___COUNTER___マクロがあります: http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html#Common-Predefined -マクロ

于 2012-03-30T20:05:37.067 に答える
3

ほとんどの人はこれを__COUNTER__マクロで行います。しかし、それは非標準であり、プログラム全体で 1 つしかありません。

これは、標準に準拠し、複数のカウンターをサポートする、テンプレートとオーバーロードを使用して思いついたC++ ハックです。

于 2012-04-01T16:06:37.200 に答える
1

を使用するとマクロgccを使用できます。__COUNTER__

于 2012-03-30T20:12:23.510 に答える
0

1 つの方法として、一意の番号が必要な場所にプレースホルダーをハードコーディングし、ファイルを前処理するための小さなユーティリティを作成して、最後に使用した番号をファイルに保持し、呼び出し間で永続化するようにすることもできます。

于 2012-03-30T19:53:12.020 に答える