0

假设我有一个包含一堆成员变量的结构。我想编写一个函数来设置任何这些成员的值(以及其他一些东西,但我认为这超出了问题的范围)。像(但显然不是)这样的东西:

struct A
{
  A() { /* do stuff */ }
  bool a1;
  bool a2;
  bool a3;
  void set_member(???);
  bool get_member(???);
};

A a;
a.set_member(a1, true);
bool value = a.get_member(a1);

现在,我的第一个想法是使用数组而不是一堆命名变量。我想这样做,但如果我能提供帮助,这是我不想以这种方式接触的代码(它是遗留的)。它有一个构造函数,所以我什至不确定它是否会保持它的二进制可序列化特性,因为它不是 POD。即使它是 POD,我仍然不相信 as a1a2并且a3可以具有与 s 数组不同的对齐方式bool

那么,回到最初的问题,有没有办法做到这一点?也许有一些我还不知道的模板技巧?

4

2 回答 2

7

您可以使用指向成员的指针:

void set_member(bool A::*var, bool value)
{
    this->*var = value;
}

A a;
a.set_member(&A::a1, true);

模板化版本很简单:

template<typename T>
void set_member(T A::*var, T value)
{
    this->*var = value;
}

但是如果您已经知道变量的名称,我看不出这样做的原因。

于 2013-10-31T21:45:58.367 回答
-1

如果所有连续成员都是相同的数据类型,则可以使用指针算术:

void set_member(size_t var, bool val)
{
  *(&a1+var) = val;
}

bool get_member(size_t var) const
{
  return *(&a1+var);
}

A a;
a.set_member(1, true);
bool value = a.get_member(1);

但是,如果您使用错误的 'var' 值,这可能会导致内存损坏或访问冲突。

于 2013-10-31T22:22:18.927 回答