模板特化,其中参数是元编程的非类型参数化模板

时间:2013-11-07 05:03:23

标签: c++ templates template-meta-programming

我有以下代码:

template<int lengthAfter>
class VariableString{
    public:
        enum{
            fieldSize = -1000
        };

....

};

template<typename T, int FieldSize = sizeof(T)>
class field_trait{
    public:
        enum{
            fieldSize = FieldSize
        };

....
};

template<int lengthAfter>
class field_trait<VariableString<lengthAfter>, -1000>{
    public:
        enum{
            fieldSize = -1000
        };
....
};

static_assert(field_trait<VariableString<0> >::fieldSize == -1000, "VariableString length error");

当我编译时,static_assert失败,我希望专业化能够工作。我哪里错了?

1 个答案:

答案 0 :(得分:1)

您的专业化仅适用于-1000的第二个参数,但它是sizeof(first argument),因为主模板中的默认值为。也就是说,您的调用实际上等同于

field_trait,sizeof(VariableString&lt; 0&gt;)&gt;

这样做

template<int lengthAfter, int size>
   class field_trait<VariableString<lengthAfter>, size>