我想在模板类中使用静态成员来为从该模板类继承的每个类实例化一个单例对象。
这是一个例子:
#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"
}
小提琴链接:http: //ideone.com/aWDEg4
所需的行为应该是 one A
、 oneB
和 oneC
应该在注册表中。但它们都不是。问题是Y<T>::instance
没有为任何类实例化,因为它没有在代码中使用。但是,我从不想使用这些字段,它们只是用于实例化单例。那么有没有一种方法可以强制实例化静态字段而无需向派生类(即 、 和 )添加额外A
的B
代码C
?
我知道我可以显式实例化template class Y<A>;
,但这会给派生类添加额外的代码A
。