我正在尝试创建一个用于处理比特流的模板类.我想有模板声明的底层整数类型,将解决要么uint8_t,uint16_t,uint32_t或者uint64_t,取决于模板参数(int类型,位数).我发现关于这方面(这两个答案,我怎么能专门为整数范围内的C++模板?和整数一系列基于模板特),并实施了以下代码:
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;
...
}
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我实例化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> >}’
Run Code Online (Sandbox Code Playgroud)
如果我实例化MyClass<8>,一切正常.所以看起来只有第一级std::conditional实际上是扩展的.
知道如何正确地做到这一点?
编辑:我之前没有说过,但我正在寻找一种解决方案,它也适用于任何位大小的实例化(只要它最多为64位).所以我也想MyClass<27>工作(选择 …