模板专精和静态本地

时间:2012-01-29 07:24:27

标签: c++ templates c++11 instantiation

我有一个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; }

这会有用吗?这是最好的方式吗?有哪些替代方法?

2 个答案:

答案 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

所有三个对象xaxbxc都是X的不同实例。但是,xaxd是相同的实例,因为它们都调用相同的功能。

需要注意的一点是,编译器为每个不同的模板参数实例化不同的函数。因此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>();
}

请注意,如果跨共享库边界使用此技术可能会严重失败。