我想在模板类中使用静态成员为每个继承自该模板类的类实例化一个单例对象。
这是一个例子:
#include <iostream>
#include <vector>
struct X{
static std::vector<X*>& getRegistry(){
static std::vector<X*> registry;
return registry;
}
X(){
getRegistry().push_back(this); // Each X adds itself to the registry
}
};
template<typename T>
struct Y : X{
private:
static T instance; // The per-type singleton
};
template<typename T>
T Y<T>::instance {};
想法是 X
类型的对象每当它们被创建时,它们都会将自己输入“注册表”。类 Y<T>
源自 X
是一个模板类,它应该实例化从它继承的每种类型的静态单例对象(使用奇怪的重复模板模式)。
这个想法是,“注册表”将包含每个继承自 Y<T>
的类的一个对象。 .这些类不需要做任何事情就可以添加到注册表中;相反,简单地继承自 Y<T>
应该足以创建一个添加到注册表的单例对象。
我试过这样的代码:
struct A : Y<A>{};
struct B : Y<B>{};
struct C : Y<C>{};
int main(){
std::cout << "Number of objects in the registry: " << X::getRegistry().size() << std::endl;
// Should print "3"
}
fiddle 链接:http://ideone.com/aWDEg4
期望的行为应该是 A
, 一个 B
, 和一个 C
, 应该在注册表中。但他们都不是。问题是 Y<T>::instance
没有为任何类实例化,因为它没有在代码中使用。但是,我从不想使用这些字段,它们只是用来实例化单例的。 那么有没有一种方法可以强制实例化静态字段,而不必向派生类(即 A
、B
和 C
)添加额外的代码?
我知道我可以显式实例化 template class Y<A>;
, 但这会向派生类添加额外的代码 A
.
最佳答案
您可以只创建静态实例:
struct A : Y<A>{};
struct B : Y<B>{};
struct C : Y<C>{};
static A a;
static B b;
static C c;
int main(){
std::cout << "Number of objects in the registry: " << X::getRegistry().size() << std::endl;
}
输出:
Number of objects in the registry: 3
关于c++ - 强制实例化模板类中的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26999126/