如何使用模板专门化常量

时间:2015-07-02 22:43:37

标签: c++ templates

我想为每个用于模板化类的不同类型返回一个不同的常量。

例如,当班级为

栈< int>我想要常数 EMPTY = -99

当班级为Stack< char>我希望常量EMPTY为'\ 0'。

到目前为止,我一直在寻找如何明确地专门化变量的语法,并且不知道从哪里开始寻找它。

一个简单的代码示例会很棒,因为这个问题一直困扰着我。

我到目前为止(没有常数)是:

template<class T>
class Stack {
private:
       T* items_;
        //EMPTY constant here

public:

    Stack();

    ~Stack();

    void push(T value);

    T pop();
};

2 个答案:

答案 0 :(得分:3)

template<class T>
class Stack {
private:
       T* items_;
       static T EMPTY;

public:
    Stack();
    ~Stack();

    void push(T value);
    T pop();
};

extern template<> int Stack<int>::EMPTY;
extern template<> char Stack<char>::EMPTY;

然后在cpp文件中:

template<> int Stack<int>::EMPTY = -99;
template<> char Stack<char>::EMPTY = '\0';

注意根据用途,这将限制您可以使用实例化模板的类型。

答案 1 :(得分:2)

您可能想要考虑是否希望将其作为堆栈的一部分,或者将其分解为常规traits类。根据您的操作,它可能对其他数据结构很有用。

template<typename T>
struct traits
{
    static T empty;
};
template<> int traits<int>::empty = 99;
template<> char traits<char>::empty = 0;


template<class T>
class Stack 
{
public:
    Stack()
    {
        T t = traits<T>::empty; 
    }
};

int main()
{
    Stack<int>(); 
    Stack<char>(); 
}