通过编译时值推断整数的类型
Deducing the type of an integer by its compiletime value
使用 C++14、17 或 20,我将两个模板参数传递给模板 class:TSize 和 MaxSize。
TSize 是 MaxSize 的类型。显然,两者在编译时都是已知的。 TSize 需要足够大以适应 MaxSize。
template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};
如何通过MaxSize的值自动推导出TSize,所以我只需要设置MaxSize的值就可以自动得到它?即:
if MaxSize<256 -> TSize=uint8_t
if MaxSize<65536 && MaxSize>255 -> TSize=uint16_t
非常感谢您的帮助!
您可以使用 std::conditional
根据编译时条件在两种类型之间进行选择。而且,如果您不想更改 Foo
,则需要一些间接方法来为 Foo
选择正确的类型(也许部分专业化也可以):
#include<type_traits>
template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};
template <unsigned value>
using Size_t_impl = typename std::conditional<(value > 255),uint16_t,uint8_t>::type;
template <unsigned value>
using FooIndirect = Foo< Size_t_impl<value>,value>;
你可以这样使用:
template<uintmax_t n>
using FittingUIntT = std::conditional_t<
n <= UINT8_MAX, uint8_t, std::conditional_t<
n <= UINT16_MAX, uint16_t, std::conditional_t<
n <= UINT32_MAX, uint32_t, uint64_t
>>>;
使用 C++14、17 或 20,我将两个模板参数传递给模板 class:TSize 和 MaxSize。
TSize 是 MaxSize 的类型。显然,两者在编译时都是已知的。 TSize 需要足够大以适应 MaxSize。
template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};
如何通过MaxSize的值自动推导出TSize,所以我只需要设置MaxSize的值就可以自动得到它?即:
if MaxSize<256 -> TSize=uint8_t
if MaxSize<65536 && MaxSize>255 -> TSize=uint16_t
非常感谢您的帮助!
您可以使用 std::conditional
根据编译时条件在两种类型之间进行选择。而且,如果您不想更改 Foo
,则需要一些间接方法来为 Foo
选择正确的类型(也许部分专业化也可以):
#include<type_traits>
template <typename TSize = uint8_t, TSize MaxSize = 15>
class Foo {};
template <unsigned value>
using Size_t_impl = typename std::conditional<(value > 255),uint16_t,uint8_t>::type;
template <unsigned value>
using FooIndirect = Foo< Size_t_impl<value>,value>;
你可以这样使用:
template<uintmax_t n>
using FittingUIntT = std::conditional_t<
n <= UINT8_MAX, uint8_t, std::conditional_t<
n <= UINT16_MAX, uint16_t, std::conditional_t<
n <= UINT32_MAX, uint32_t, uint64_t
>>>;