如何使用模板专门化常量

How do you specialize constants using templates

本文关键字:专门化 常量 何使用      更新时间:2023-10-16

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

例如,当类是时

堆栈<int>我想要常数空=-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();
};
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 = '';

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

您可能需要考虑是否希望将其作为堆栈的一部分,或者将其作为一个通用特性类。根据您所做的操作,它可能对其他数据结构有用。

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>(); 
}