我有一个枚举变量名v1,v2...,vn,每个变量名都有一个同名的类,我想在编译时(即使我不知道在运行时是否可能)找到这些类的sizeof之和,如下面的例子所示,你能用模板或预处理器来做吗?
enum class Enum
{
First,
A = First,
B,
C,
Last
};
class A
{
// ...
};
class B
{
// ...
};
class C
{
// ...
};
constexpr size_t GetTotSumSizeOf()
{
// iterate from Enum::First to Enum::Last, summing sizeof the corresponding class
}
static constexpr size_t TotSum = GetTotSumSizeOf();
4条答案
按热度按时间k5ifujac1#
c++不允许你直接迭代枚举类。所以你可以通过创建一个helper结构来获得想要的结果,helper结构将每个枚举值Map到它相应的类,然后使用模板递归地计算总和。为每个枚举值创建一个EnumToClass结构的模板特化。然后使用GetSizeOfHelper模板函数递归地计算相应类的大小总和。最后使用GetToSumSizeof函数调用递归函数并将其 Package 。
sd2nnvve2#
您可以编写一个constexpr例程,通过类的Enum标识符返回类的信息,然后在constexpr
GetTotSumSizeOf
中汇总这些信息。枚举标识符和类名的关联是手动的。语言中没有任何东西将它们联系在一起或强制它们是正确的。
66bbxpm53#
从注解中假设不需要实际的
enum
,可以通过类型系统列出类,并在其上构建标识符生成:See it live on godbolt.org
yiytaume4#
正如在注解中提到的,一种选择是使用外部脚本来生成枚举类和total_size变量,但这不是很容易维护。即使您自动配置脚本在每次编译之前运行,它也会增加编译时间的膨胀,而且IDE在开发过程中会因为未定义的符号而变得疯狂。所以我认为最好手动指定。
我提出的一个更简单的构造使用单个static_assert来确保程序员记住指定与枚举值相同数量的类。
然而,这种方法对于枚举变量名的意外更改和忘记更新相应的sizeof()并不安全,这就是为什么我接受的答案,因为我认为它是最可靠的。