c++ - 以通用方式对所有结构成员求和

标签 c++ gcc c++98

我有很多代表计数器的 C 结构。 这些结构由多个相同类型的成员组成,比方说 uint64_t。在程序中,我有多个相同结构的实例,在某些情况下,我需要对所有这些相同结构求和。我不想为此使用 operator+,因为将来结构可能会改变并且有更多或更少的成员,我也不想总是修改运算符。

我认为我可以使用 sizeof 并从该结构创建结构成员类型的数组,然后对数组求和。我会把那个结构和一个数组结合起来。这将解决我不想在添加或删除新成员时修改运算符的问题,但这仅在结构仅包含相同类型的成员时有效。

所以也许有一些通用的模板方法可以执行此操作,但我对模板不是很擅长,所以我向 C++ 专家寻求帮助。

这种结构的例子:

struct counter{
    uint64_t a;
    uint64_t b;
    uint64_t c;
    uint64_t d;
    uint64_t e;
};

最佳答案

这不是最好的方法,但实现您需要的功能的一种方法是:

/* counter.xh */
COUNTER_MEMBER(uint64_t, a);
COUNTER_MEMBER(uint64_t, b);
COUNTER_MEMBER(uint64_t, c);
COUNTER_MEMBER(uint64_t, d);
COUNTER_MEMBER(uint64_t, e);

然后在一些标题中:

/* counter.h */

struct counter{
#define COUNTER_MEMBER(TYPE,NAME) TYPE NAME;
    #include "counter.xh"
};

现在添加函数:

/* foo.cpp */
uint64_t add_members(const counter &obj) {
  uint64_t sum = 0LLU;
#define COUNTER_MEMBER(TYPE,NAME) sum += obj.NAME;
#include "counter.xh"
  return sum;  /* I hope there was no overflow */
}

Live example

关于c++ - 以通用方式对所有结构成员求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37519691/

相关文章:

C++11 异常的析构函数现在允许抛出吗?

c++ - OpenGL:三角形带中的退化三角形在 OpenGL-ES 之外是否可以接受?

c - in - gcc 内联汇编的操作数类型不匹配

debugging - 为什么我们需要编译器发出的 DWARF eh_frame?

C 和汇编 __asm 不工作

c++98 - 是否有符合 ANSI/ISO 标准的 Turbo C++?

c++ - map 没有为自定义结构命名模板类型

python - Python中的递增迭代器(iter)

c++ - 如何将一个无符号的 short 一分为二

c++ - 尝试随机播放 std::vector 时出错