我认为提出这个问题的最简单方法是首先给出代码示例(我已经在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
类型的常量是有道理的。我不知道如何进行专业化,或者甚至可能。或者
如果不可能,我可以采取不同的方法吗?
答案 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<>
有三个参数,所以如果你不想指定它们,必须为每个参数使用一个模板参数。