如何在不提前知道成员名称的情况下编写函数来修改结构的成员值?

How can I write a function to modify a struct's member value without knowing the member's name ahead of time?

本文关键字:成员 情况下 函数 结构 修改      更新时间:2023-10-16

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

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 数组上的对齐方式不同。

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

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

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;
}

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

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

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"值,这可能会导致内存损坏或访问冲突。

相关文章: