通过其编译时值推导整数的类型

问题描述 投票:4回答:2

使用C ++ 14、17或20,我将两个模板参数传递给模板化的类: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

非常感谢您的帮助!

c++ c++14 c++17 c++20
2个回答
0
投票

您可以使用std::conditional根据编译时条件在两种类型之间进行选择。而且,如果您不想更改std::conditional,则需要一些间接方法来为Foo选择正确的类型(也许也可以进行部分专业化处理):

Foo

0
投票

您可以使用类似这样的内容:

#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 >>>;

© www.soinside.com 2019 - 2024. All rights reserved.