如何使用模板专门化常量
Posted
技术标签:
【中文标题】如何使用模板专门化常量【英文标题】:How do you specialize constants using templates 【发布时间】:2015-07-02 22:43:36 【问题描述】:我想为模板类使用的每种不同类型返回一个不同的常量。
例如,当类是
Stack
当类是 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';
请注意,根据使用情况,这将限制您可以实例化模板的类型。
【讨论】:
这给了我错误:'StackDynamicStack<int>::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 模板中使用常量类?