针对几个可能的参数(类型名称)的专门化类

时间:2012-09-17 21:21:16

标签: c++ templates c++11

我有一个模板类,唯一的模板参数是typename。

template<typename T>
class Reader{
    ...
}

现在我想为每个整数类型专门化它,例如:

template<typename T - integral>
class Reader{
    //another code
}

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:5)

你可以只是一个额外的默认布尔参数:

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
    ...
}

答案 1 :(得分:3)

在类似的情况下,我使用了专门针对所有特殊类型的类模板的强力方法。我意识到这些是相当多的,它可以变得很快很痛苦。但是,将有趣的成员分解为所有专业化共享的基类工作得相当好。在我使用这种方法的情况下,我通常只在类中有静态成员,即构造函数不是继承的事实不是问题(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> {};

不可否认,我们有太多的整数类型! 六个不同的字符类型有点荒谬。

答案 2 :(得分:2)

您可以使用虚拟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)的条件。