我有一个模板类,唯一的模板参数是 typename。
template<typename T>
class Reader{
...
}
现在我想为每个整数类型专门化它,比如:
template<typename T - integral>
class Reader{
//another code
}
我怎样才能做到这一点?
您可以只使用一个额外的默认布尔参数:
template<typename T, bool IsIntegral = std::is_integral<T>::value>
class Reader{ // primary template, used for non-integrals
...
}
template<typename T>
class Reader<T, true> { // specialization for integral types
...
}
在类似的情况下,我使用了针对所有特殊类型专门化类模板的蛮力方法。我意识到这些是相当多的,而且很快就会变得相当痛苦。然而,将有趣的成员分解到一个由所有专业共享的基类中工作得相当好。在我使用这种方法的情况下,我通常在类中只有静态成员,即构造函数未被继承的事实不是问题(C++ 2011 支持也继承构造函数的语法,但同时点是保持记谱法):
template <typename T> class Reader { ... };
template <typename T> class IntReader { /* special version for integers */ };
// to bool or not bool?
template <> class Reader<wchar_t>: public IntReader<wchar_t> {};
template <> class Reader<char>: public IntReader<char> {};
template <> class Reader<char16_t>: public IntReader<char16_t> {};
template <> class Reader<char32_t>: public IntReader<char32_t> {};
template <> class Reader<signed char>: public IntReader<signed char> {};
template <> class Reader<signed short>: public IntReader<signed short> {};
template <> class Reader<signed int>: public IntReader<signed int> {};
template <> class Reader<signed long>: public IntReader<signed long> {};
template <> class Reader<signed long long>: public IntReader<signed long long> {};
template <> class Reader<unsigned char>: public IntReader<unsigned char> {};
template <> class Reader<unsigned short>: public IntReader<unsigned short> {};
template <> class Reader<unsigned int>: public IntReader<unsigned int> {};
template <> class Reader<unsigned long>: public IntReader<unsigned long> {};
template <> class Reader<unsigned long long>: public IntReader<unsigned long long> {};
诚然,我们的整数类型太多了!拥有六种不同的角色类型有点荒谬。
您可以使用虚拟std::true_type
参数
template<typename T, typename = std::true_type>
class Reader {
};
template<typename T>
class Reader<T, std::integral_constant<bool,
std::is_integral<T>::value> > {
// ...
};
顺便说一句,您会看到这种模式与void
而不是true_type
一起使用,专业化经常使用enable_if
和更复杂(以及涉及 SFINAE)的条件。