在这里插入代码片
#include <type_traits>
#include <iostream>
template<typename...>
using void_t = void;
//用于从可变字段类型列表中获取结构体相关信息
template<std::size_t align_size, typename T, typename... Ts>
struct StructProperty
{
private:
constexpr static std::size_t cur_align_size = align_size > sizeof(T) ? sizeof(T) : align_size;
constexpr static std::size_t cur_p = StructProperty<align_size,Ts...>::next_p;
public:
constexpr static std::size_t elem_num = sizeof...(Ts) + 1;
constexpr static std::size_t size_sum = sizeof(T) + StructProperty<align_size,Ts...>::size_sum;
constexpr static std::size_t max_size = sizeof(T) > StructProperty<align_size,Ts...>::max_size ? sizeof(T) : StructProperty<align_size,Ts...>::max_size;
//按照指定对齐字节数求结构体大小,用于检查指定对齐字节数是是否正确
constexpr static std::size_t cur_elem_size = sizeof(T);
constexpr static std::size_t next_p = ((cur_elem_size > StructProperty<align_size,Ts...>::cur_elem_size && cur_p % cur_align_size != 0) ? (cur_p / cur_align_size + 1) * cur_align_size : cur_p) + cur_elem_size;
constexpr static std::size_t struct_size = next_p % align_size == 0 ? next_p : (next_p/align_size + 1) * align_size;
};
template<std::size_t align_size,typename T>
struct StructProperty<align_size, T>
{
constexpr static std::size_t elem_num = 1;
constexpr static std::size_t size_sum = sizeof(T);
constexpr static std::size_t max_size = sizeof(T);
constexpr static std::size_t cur_elem_size = sizeof(T);
constexpr static std::size_t next_p = sizeof(T);
constexpr static std::size_t struct_size = next_p % align_size == 0 ? next_p : (next_p/align_size + 1)
【C++模板】结构体数据转换
于 2022-05-01 19:55:12 首次发布