特定の整数に対して作成できるルックアップ テーブルのタイプがあるとします。
class FooLookupTable {
...
public:
FooLookupTable(int radix) {
...
}
};
次に、テンプレート パラメーターが同じ整数で、コンストラクターがこのルックアップ テーブルのメンバー インスタンスを初期化するクラスがあります。
template <int radix> class Foo {
...
private:
FooLookupTable table;
public:
Foo () : FooLookupTable (radix) {
...
}
};
コード全体で、基数のさまざまな値を使用してこれらをインスタンス化します。
int main() {
...
Foo<1> myFoo;
Foo<1> yourFoo;
Foo<10> theirFoo;
...
}
これは機能し、毛むくじゃらのスレッドや API の問題は発生しません。myFoo
しかし、 と の間で1 の基数テーブルを共有していませんyourFoo
。仮定されたスレッド ライブラリへの依存関係をハードコーディングし、オンデマンドで埋められるグローバル マップを構築することができました。しかし、私の質問は次のとおりです。
「現代の C++11 の世界では、標準ライブラリの外に依存関係を持たない Foo 用のライブラリを設計するためのクリーンな方法はありますか?」
テンプレートクラスの個別のインスタンス化ごとに静的メンバー変数が1つしか作成されないため、これには静的メンバーを使用することを考えました。しかし、これにより、静的メンバーのスペースを宣言する責任があるのは誰かという問題が生じます。そうする人は、「それを初期化する正しい方法を知っている」必要があります。
FooLookupTable Foo<1>::table (1);
FooLookupTable Foo<10>::table (10);
int main() {
...
Foo<1> myFoo;
Foo<1> yourFoo;
Foo<10> theirFoo;
...
}
「 C++ 静的メンバーの初期化 (内部のテンプレートの楽しみ) 」のような主題について書かれていることを読んでも、何かが欠けていない限り、あまり希望が持てないようです。Foo
また、インスタンス自体が静的だったらどうなるでしょうか? :-/