假设我有一个包含大量成员变量的结构。我想编写一个函数来设置任何这些成员的值(以及其他一些东西,但我认为这超出了问题的范围)。像(但显然不是)这样的东西:
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,我仍然不相信a1
,a2
和a3
可以具有与bool
s数组不同的对齐方式。
所以,回到原来的问题,有没有办法做到这一点?也许还有一些我不知道的模板技巧?
答案 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'值,这可能会导致内存损坏或访问冲突。