如何使用模板专门化常量

Posted

技术标签:

【中文标题】如何使用模板专门化常量【英文标题】:How do you specialize constants using templates 【发布时间】:2015-07-02 22:43:36 【问题描述】:

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

例如,当类是

Stack 我想要常量 EMPTY = -99

当类是 Stack 我希望常量 EMPTY 为 '\0'。

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

一个简单的代码示例会很棒,因为这个问题已经困扰了我一段时间。

到目前为止我所拥有的(没有常量)是:

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

public:

    Stack();

    ~Stack();

    void push(T value);

    T pop();
;

【问题讨论】:

函数返回一个常数值就足够了吗?我的经验是,有时普通的“常量”即使在非模板类中也会造成麻烦。 是的,没关系,我一直在尝试,但遇到了问题。但欢迎所有建议 【参考方案1】:
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';

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

【讨论】:

这给了我错误:'Stack'的多重定义 如果您之前为相同的模板参数专门化了成员,则该标准禁止专门化模板。因此,如果您想让堆栈专门用于 int 则首先声明类专门化,然后定义静态(在 cpp 文件中) - 这只是普通的模板专门化 另一个可能的错误来源是我为您没有的 ctor 和 dtor 放置了空定义。我会编辑答案。 遗憾的是,这个或下一个答案都不会为我编译。你写的代码在我看来完全合乎逻辑,但 GCC 不会停止抱怨多个定义。 CMakeFiles\bonus_ass2.dir/objects.a(a2_dynamic_stack.cpp.obj):a2_dynamic_stack.cpp:(.data+0x0):DynamicStack&lt;int&gt;::EMPTY' CMakeFiles\bonus_ass2.dir/objects.a(main.cpp.obj):main.cpp:(.data+0x0): first defined here CMakeFiles\bonus_ass2.dir/objects.a(a2_dynamic_stack.cpp.obj): In function _tcf_0'的多重定义:【参考方案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>(); 

【讨论】:

以上是关于如何使用模板专门化常量的主要内容,如果未能解决你的问题,请参考以下文章

playframework:如何在 html 模板中使用常量类?

如何获取指向专门针对字符串的模板函数的指针?

如何在 C++ 中专门化 std::vector 的模板模板参数

thinkphp常量怎么定义并在模板中使用?

如何编写一个接受每个类和类模板的 C++ 模板?

如何将现有模板类部分专门化为新类型?