gpt4 book ai didi

c++ - 如何专门针对多个整数值范围的 C++ 模板?

转载 作者:太空狗 更新时间:2023-10-29 23:49:00 25 4
gpt4 key购买 nike

我正在尝试创建一个模板类来处理比特流。我想在模板中声明一个基础整数类型,该类型将解析为 uint8_t , uint16_t , uint32_tuint64_t ,取决于模板参数(一个整数,位数)。我找到了关于这个主题的两个答案(How can I specialize a C++ template for a range of integer values?Integer range based template specialisation)并实现了以下代码:

template<int BITS>
class MyClass {
typedef typename
std::conditional< BITS <= 8, uint8_t,
std::conditional< BITS <= 16, uint16_t,
std::conditional< BITS <= 32, uint32_t, uint64_t > > >::type
int_type;
...
}

在我的程序中,我实例化了 MyClass<32> ,但是在编译时,出现以下错误:

no known conversion for argument 1 from ‘uint32_t {aka unsigned int}’ to ‘MyClass<32>::int_type {aka std::conditional<false, short unsigned int, std::conditional<true, unsigned int, long unsigned int> >}’

如果我正在实例化 MyClass<8>相反,一切正常。所以看起来只有第一层std::conditional实际上是展开的。

知道如何正确执行此操作吗?

编辑: 我之前没有说明这一点,但我正在寻找一种解决方案,该解决方案也适用于任何位大小的实例化(只要它最多为 64 位)。所以我想要 MyClass<27>也可以工作(选择 uint32_t )。

最佳答案

越简单越好:

template<unsigned nbits> struct uint {};

template<> struct uint<8> { using type = uint8_t; };
template<> struct uint<16> { using type = uint16_t; };
template<> struct uint<32> { using type = uint32_t; };
template<> struct uint<64> { using type = uint64_t; };

template<int nbits>
struct MyClass { using int_type = typename uint<(nbits/8)*8>::type; };

关于c++ - 如何专门针对多个整数值范围的 C++ 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172942/

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