从大小映射到相应的uintN_t类型
Mapping from a size to the corresponding uintN_t type
给定一个constexpr大小的N
,是否有某种方法可以在编译时将其映射到相应的uintN_t
类型,而无需编写我自己的详尽映射,例如:
template <size_t N>
struct size_to_type {};
template<>
struct size_to_type<8> { using type = uint8_t; };
template<>
struct size_to_type<16> { using type = uint16_t; };
// etc
当对应的类型不存在时,我可以处理错误。
是否有某种方法可以在编译时将其映射到相应的uintN_t类型,而无需编写我自己的详尽映射[?]
我能想象的最好的是一个类型特征,给定一个数字(大小(和一个类型列表(一个std::uintXX_t
序列或你喜欢的(,选择第一个完全包含给定字节数的类型。
需要一些作品,但可用于不同类型的列表。
给定以下递归助手类
template <std::size_t N, typename T0, typename,
bool = (N == CHAR_BIT * sizeof(T0))>
struct st_helper;
template <std::size_t N, typename T0, typename Tpl>
struct st_helper<N, T0, Tpl, true>
{ using type = T0; };
template <std::size_t N, typename T0, typename T1, typename ... Ts>
struct st_helper<N, T0, std::tuple<T1, Ts...>, false>
: public st_helper<N, T1, std::tuple<Ts...>>
{ };
template <std::size_t N, typename T0>
struct st_helper<N, T0, std::tuple<>, false>
{ };
自定义类型为
template <std::size_t N, typename T0, typename ... Ts>
struct selectType : public st_helper<N, T0, std::tuple<Ts...>>
{ };
template <std::size_t N, typename ... Ts>
using selectType_t = typename selectType<N, Ts...>::type;
以下是的完整编译示例
#include <iostream>
#include <climits>
template <std::size_t N, typename T0, typename,
bool = (N == CHAR_BIT * sizeof(T0))>
struct st_helper;
template <std::size_t N, typename T0, typename Tpl>
struct st_helper<N, T0, Tpl, true>
{ using type = T0; };
template <std::size_t N, typename T0, typename T1, typename ... Ts>
struct st_helper<N, T0, std::tuple<T1, Ts...>, false>
: public st_helper<N, T1, std::tuple<Ts...>>
{ };
template <std::size_t N, typename T0>
struct st_helper<N, T0, std::tuple<>, false>
{ };
template <std::size_t N, typename T0, typename ... Ts>
struct selectType : public st_helper<N, T0, std::tuple<Ts...>>
{ };
template <std::size_t N, typename ... Ts>
using selectType_t = typename selectType<N, Ts...>::type;
int main ()
{
using t08 = selectType_t<8u, std::uint8_t, std::uint16_t,
std::uint32_t, std::uint64_t>;
using t16 = selectType_t<16u, std::uint8_t, std::uint16_t,
std::uint32_t, std::uint64_t>;
using t32 = selectType_t<32u, std::uint8_t, std::uint16_t,
std::uint32_t, std::uint64_t>;
using t64 = selectType_t<64u, std::uint8_t, std::uint16_t,
std::uint32_t, std::uint64_t>;
// compilation error
//using t24 = selectType_t<24u, std::uint8_t, std::uint16_t,
// std::uint32_t, std::uint64_t>;
static_assert( std::is_same_v<t08, std::uint8_t> );
static_assert( std::is_same_v<t16, std::uint16_t> );
static_assert( std::is_same_v<t32, std::uint32_t> );
static_assert( std::is_same_v<t64, std::uint64_t> );
}
如果您愿意,您可以修改st_helper
以选择第一个包含N
字节的类型,更改<=
中的==
template <std::size_t N, typename T0, typename,
bool = (N <= CHAR_BIT * sizeof(T0))>
struct st_helper;// ^^
通过这种方式,t24
现在编译
// now compile
using t24 = selectType_t<24u, std::uint8_t, std::uint16_t,
std::uint32_t, std::uint64_t>;
成为std::uint32_t
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型