如何在不事先知道成员姓名的情况下编写修改结构成员值的函数?

时间:2013-10-31 21:41:26

标签: c++

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

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,我仍然不相信a1a2a3可以具有与bool s数组不同的对齐方式。

所以,回到原来的问题,有没有办法做到这一点?也许还有一些我不知道的模板技巧?

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:-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'值,这可能会导致内存损坏或访问冲突。