gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:12:42 24 4
gpt4 key购买 nike

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

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。

最佳答案

我认为您对仅适用于整数类型的模板感兴趣。您正在寻找的是 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;
}

关于c++ - 是否可以编写适用于所有整数类型的类模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com