您是否可以为具有非类型参数的模板类型部分专门化模板

时间:2014-02-03 20:40:12

标签: c++ templates partial-specialization

我认为提出这个问题的最简单方法是首先给出代码示例(我已经在ideone上提供了它:http://ideone.com/OjK2sk):

template <typename IntType, IntType MIN_VAL, IntType MAX_VAL>
struct BoundInt
{
    static constexpr IntType MIN = MIN_VAL;
    static constexpr IntType MAX = MAX_VAL;

    IntType value;
};

template <typename T> struct ConversionTraits;

template <typename T>
struct Value
{
    // Pointless for the sake of this example
    void convert()
    {
        ConversionTraits<T>::convert();
    }

    T value;
};

// this 'implementation' is also pointless for example purposes
struct ConvertImpl
{
    static void convert() { }
};
template <> struct ConversionTraits<int> : public ConvertImpl {};

// This is my problem. How do I partially specialise for something that has
// constants as template parameters.
template <typename IntType>
struct ConversionTraits< BoundInt<IntType, IntType, IntType> >
{
    static void convert() {}
};

int main()
{
    Value<int> intval;
    intval.convert();

    Value<BoundInt<unsigned, 0, 100>> value;
    value.convert();
}

如评论中所示,我无法弄清楚如何为ConversionTraits专门化BoundInt.编译器(gcc 4.7)告诉我BoundInt的参数2和3 ,它期望IntType类型的常量是有道理的。我不知道如何进行专业化,或者甚至可能。或者

如果不可能,我可以采取不同的方法吗?

1 个答案:

答案 0 :(得分:2)

这个怎么样:

template <typename IntType, IntType MIN_VAL, IntType MAX_VAL>
struct ConversionTraits< BoundInt<IntType, MIN_VAL, MAX_VAL> >
{
    static void convert() {}
};

它可能看起来相似,因为普通ConversionTraits<>模板只有1个参数,而专业化有3个。

但是,模板BoundInt<>有三个参数,所以如果你不想指定它们,必须为每个参数使用一个模板参数。