假设我有一种可以为给定整数构建的查找表:
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 设计一个在标准库之外没有依赖关系的库?”
我想为此使用一个静态成员,因为模板类的每个单独实例化只创建一个静态成员变量。但这提出了谁负责为静态成员声明空间的问题,而这样做的人必须“知道初始化它的正确方法”:
FooLookupTable Foo<1>::table (1);
FooLookupTable Foo<10>::table (10);
int main() {
...
Foo<1> myFoo;
Foo<1> yourFoo;
Foo<10> theirFoo;
...
}
阅读有关“ C++ 静态成员初始化(内部模板乐趣) ”之类的主题似乎并没有太大希望……除非我遗漏了什么。另外,如果Foo
实例本身是静态的,会发生什么?:-/