如您所知,模板参数可以是类型或整数值, 所以例如你可以
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。
答案 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。