如何解决编译时:计算类型X的成员#〜N并定义一个成员数组[N]?
是否有一种方法可以在编译时计算结构中的成员数(以下示例中的int),并在同一结构中定义一个大小相同的数组?可以使用MACRO或模板化结构而不是int类型。
struct A
{
int myInts[numInts()]; // here numInts() == 2
int a;
char b;
char c;
int d;
char e;
};
我觉得某些constexpr骇客可能是可行的,但尚未找到解决方案。我需要创建一个数组,在该数组中可以压缩所有成员的副本,并且需要在编译时静态分配该数组。成员的数量因结构而异,但数组应自动增长以为所有感兴趣的成员留出空间。同样使情况更糟的是,需要在其他成员之前定义数组。
======编辑
似乎没有一种解决方案可以在没有过度复杂的整体结构设计的情况下完成上述工作。相反,我需要手动指定数组大小。
解决方法
使用magic_get library的某些类型是可能的。限制是:
T必须是constexpr聚合可初始化的,并且不能包含引用或位域
您帖子中的结构A
满足此条件。
magic_get
使用聚合初始化检测非静态数据成员的数量。基本上,这种想法是,如果您有某种类型的U
可以转换为任何其他类型,那么当T{U(),U(),...,U()}
的数量等于元素数量时,U()
的格式会正确总计T
中。 (如果T
的某些成员具有默认的成员初始值设定项或可以进行值初始化,则当初始值设定项少于元素时,此表达式也可能格式正确,因此必须使用最大的数目。 ),并且SFINAE可用于检测这样的表达式是否格式正确。
您可以在fields_count.hpp
中查看所有血腥细节。 ,可以使用MAP-MACRO和某些模板进行批准。
您需要使用宏定义结构并将所有字段传递给它(例如DEFINE_STRUCT(A,int a,char b,...)
)。可以通过在类型为int
的辅助函数上应用递归模板来计算void(int a,...)
(或所需的其他类型)字段的数量。在每个字段后附加分号需要使用MAP-MACRO。
#include <type_traits>
#include "map-macro/map.h" // https://github.com/swansontec/map-macro,we need the `MAP` macro
// Count how many arguments of Func are of type T
template<typename T,typename Func>
struct count_of_type;
template<typename T>
struct count_of_type<T,void()> { static constexpr std::size_t value = 0; };
template<typename T,typename FirstArg,typename...RestArgs>
struct count_of_type<T,void(FirstArg,RestArgs...)> {
static constexpr std::size_t value = std::is_same<T,FirstArg>::value + count_of_type<T,void(RestArgs...)>::value;
};
// Define your structs
#define APPEND_SEMICOLON(FIELD) FIELD;
#define DEFINE_STRUCT(NAME,FIELDS,...) \
struct NAME { \
int myInts[count_of_type<int,void(FIELDS,##__VA_ARGS__)>::value]; \
MAP(APPEND_SEMICOLON,##__VA_ARGS__) \
};
DEFINE_STRUCT(A,char c,int d,char e)
static_assert(std::is_same<decltype(A().myInts),int[2]>::value,"");
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。