我有一个X级......
class X {...}
我希望为某些类型的每个不同类型都有一个X实例。 (其中一些类型不是类和/或不是我写的。)
要做到这一点,我想到了:
template<typename T> X& XT();
然后对于每种类型A,B和C:
template<> X& XT<A>() { static X x; return x; }
template<> X& XT<B>() { static X x; return x; }
template<> X& XT<C>() { static X x; return x; }
这会有用吗?这是最好的方式吗?有哪些替代方法?
答案 0 :(得分:2)
您无需专门化该功能。你可以这样做:
template<typename T>
X& XT()
{
static X x;
return x;
}
并将其用作:
X &xa = XT<A>();
X &xb = XT<B>();
X &xc = XT<C>();
X &xd = XT<A>(); //xd is same as xa
所有三个对象xa
,xb
和xc
都是X的不同实例。但是,xa
和xd
是相同的实例,因为它们都调用相同的功能。
需要注意的一点是,编译器为每个不同的模板参数实例化不同的函数。因此XT<A>()
与XT<B>()
的功能不同,每个函数都有自己的 static
局部变量。因此static
中的XT<A>()
局部变量与XT<B>()
中的变量不同。
答案 1 :(得分:0)
您甚至不需要单独定义每个:
#include <iostream>
template<typename T, typename X>
struct static_holder {
static T static_instance;
};
template<typename T, typename X>
T static_holder<T,X>::static_instance;
template<typename T, typename X>
T &get_static_instance() {
return static_holder<T,X>::static_instance;
}
现在你可以定义:
template<typename K>
X &XT() {
return get_static_instance<X, K>();
}
请注意,如果跨共享库边界使用此技术可能会严重失败。