【问题标题】: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();
};

【问题讨论】:

  • 函数返回一个常数值就足够了吗?我的经验是,有时普通的“常量”即使在非模板类中也会造成麻烦。
  • 是的,没关系,我一直在尝试,但遇到了问题。但欢迎所有建议

标签: c++ templates


【解决方案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>(); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多