2016-12-06 8 views
0

今は私のライブラリの最初の部分に2つの最後の問題があります。 (私はconstexprのバージョンをしたい場合)と、最初のものはハックせずにC++でこの事は不可能である、それは派生クラスカウンターです:派生クラスの自動カウンタ/代替?

class FooBase { 

    protected: 
    static int Counter; 
}; 

class Foo : public FooBase { 

    public: 
    static const int Type; 
}; 

const int Foo::Type = ++FooBase::Counter; 

struct FooTest : public Foo {}; 

は、ソースファイルである必要があります

int FooBase::Counter = 0; 

なぜこのカウンターが必要ですか?まあ、別の配列に型とインデックスとして使用します。

は、私はそれを持つ2つの問題を抱えている:

  • Typeconstexprありませんが、この事は
  • not really possibleが、私は私の全体のソースファイルに貼り付ける必要があり、コードの行だけを持っているようですライブラリ

派生クラスがいくつあるか分かります(恐ろしいことではありませんが)。助けがあれば、何か良いことは分かりません。

クラスを追加することを意味する場合でも、の候補/代替候補が表示されます。少なくともint FooBase::Counter = 0;行を削除することができれば、それはいいでしょう。

PS:C++の制限はありません。TSは歓迎します。

PSS:実際のケースはもう少し複雑でCRTPを使用していますが、問題ではないと思います。

+0

この設定では、できません。私は何が間違っているかは分かりません。これは継承設定なので、子クラスは親クラスのカウンタを使用できます。または、ベクトルを使用してsize()を使用することができますfunctoin –

+0

私はそれを使用することはできませんが、私は今やっていることを言ったことはありません。私はより明示的な方法で問題を解決します。 –

+0

http://stackoverflow.com/a/8596825/1561291これはあなたが探している解決策かもしれません。 –

答えて

0

原則として、派生クラスカウンタをコンパイル時定数にすることはできません。その理由は、コンパイラが1つの翻訳単位をコンパイルするとき、他の翻訳単位に含まれる派生クラスの数、またはそれらをリンクする順番をコンパイラが知ることができないためです。

さらに悪いことに、実行時にロードする動的ライブラリに派生クラスを含むオブジェクトファイルを配置することもできます。その場合、派生クラスの総数はプログラムの実行時にに変更されることがあります。また、コンパイラがそうであるかどうかを判断する方法はありません。

要するに、見ているのはC++言語の特定の欠点ではなく、別のコンパイルモデルの基本的な制限です。つまり、あなたがそれをしたいのであれば、constexpr変数の初期化式を生成するための完全なソースコード上で動作する外部ツールを書く必要があります。

+0

いくつかの値を持つヘッダーを作成してコード内で使用するツールは、将来私は他のもののためにそのようなものに考えていましたが、はい、今すぐやります。ありがとう:) –