在不实例化模板的情况下访问模板化类的公共静态成员?

时间:2013-02-13 05:43:28

标签: c++ template-meta-programming

我有一个模板化的类,并希望从外部访问一个公共静态变量,但是如果没有实例化模板,我无法想出任何方法。这段代码:

template<class T>
class TemplatedClass {
    public:
        static const int static_member = 10;
};

...

int i = TemplatedClass::static_member;

产生以下错误:“'模板类TemplatedClass'在没有模板参数的情况下使用。”

如果我在访问变量时实例化该类:

int i = TemplatedClass<int>::static_member;

错误消失了。我宁愿不必在一个上下文中实例化一个模板,它只是为了抑制错误而使用虚拟类型参数没有意义。如果必须的话,最好使用哪种假型?我试过&lt;&gt;和&lt; void&gt;,但都没有用。

2 个答案:

答案 0 :(得分:4)

无法完成,因为专业化可能会覆盖该值,即:

template<class T>
class TemplatedClass : public BaseClass
{
    static const int value = 42;
};

template<>
class TemplatedClass<StarTrek>
{
    static const int value = 47;
}

因此,您将得到不同的值:

TemplatedClass<StarTrek>::value != TemplatedClass<void>::value      

如果值相等,我强烈建议您添加非模板基类:

class BaseClass {
public:
    static const int value = 42;
};

template<class T>
class TemplatedClass : public BaseClass
{
    ...
}

实例化或显式虚拟类型(即void)可能有效,但根据您使用模板参数的方式,可能会出现编译错误。

int x = TemplatedClass<void>::value;

所以,编写清楚显示您的意图的代码,即所有实例化的常见值不应该在依赖于类型的模板类中。如果你不能那样做,请详细解释你想要做的事情。

答案 1 :(得分:2)

使用虚拟类型可能适用于琐碎的类,但如果事情变得更复杂则不行。

让我们想象一下,你的班级“继续”这样:

template<class T>
class TemplatedClass {
public:
    static const int static_member = 10;
    typedef typename std::enable_if< std::is_integral< T >::value >::type type;
};

此代码告诉我们T 不能是非整数类型。

更新(感谢jogojapan): 这就是为什么在某些情况下你不能使用任何类型作为虚拟类型