是否可以编写适用于所有整数类型的类模板?

时间:2017-05-25 18:31:19

标签: c++ template-meta-programming

如您所知,模板参数可以是类型或整数值, 所以例如你可以

template<typename T, size_t BufferSize>
small_vector {
//...

我遇到的问题是我想编写适用于不同整数类型的模板。

这样的事情:

constexpr short sa=1, sb=2, sc=3;
my_template_class1<sa,sb,sc>;
constexpr int ia=1, ib=2, ic=3;
my_template_class2<ia,ib,ic>;

换句话说,我知道模板类型参数可以是int,我想要的是有一个模板,它将使用所有整数类型的整数模板参数。 请注意,我不能只在int64中进行所有计算,因为它不适用于uint64。

2 个答案:

答案 0 :(得分:1)

我认为您对模板感兴趣,该模板仅适用于整数类型。您正在寻找的是std::enable_if。通过使用它,如果您尝试使用除了整数类型之外的任何东西来创建它,模板将抛出编译错误。它也适用于任何和所有整体类型。

#include <iostream>
#include <type_traits>

// 1. the return type (bool) is only valid if T is an integral type:
template <class T>
typename std::enable_if<std::is_integral<T>::value,bool>::type
  is_odd (T i) {return bool(i%2);}

// 2. the second template argument is only valid if T is an integral type:
template < class T,
           class = typename std::enable_if<std::is_integral<T>::value>::type>
bool is_even (T i) {return !bool(i%2);}

int main() {

  short int i = 1;    // code does not compile if type of i is not integral

  std::cout << std::boolalpha;
  std::cout << "i is odd: " << is_odd(i) << std::endl;
  std::cout << "i is even: " << is_even(i) << std::endl;

  return 0;
}

答案 1 :(得分:-2)

通常您可以通过添加额外的“启用”模板参数来实现此目的:

// the partial specialization of A is enabled via a template parameter
template<class T, typename BufferSize, class Enable = void>
class small_vector {}; // primary template, not used

template<class T, typename BufferSize>
class small_vector<class T, typename BufferSize, typename std::enable_if<std::is_integral<BufferSize>::value>::type> {
}; // specialization for various int types

话虽如此,我建议不要在各种BufferSize实现中付出太多努力。它们很可能在编译时使用,只消耗没有内存或CPU。