如何在不提前知道成员名称的情况下编写函数来修改结构的成员值?
How can I write a function to modify a struct's member value without knowing the member's name ahead of time?
>假设我有一个结构,它有一堆成员变量。 我想编写一个函数来设置任何这些成员的值(以及其他一些东西,但我认为这超出了问题的范围)。 像(但显然不是)这样的东西:
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
数组上的对齐方式不同。
那么,回到最初的问题,有没有办法做到这一点? 也许有一些我还不知道的模板技巧?
您可以使用指向成员的指针:
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"值,这可能会导致内存损坏或访问冲突。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在这种情况下,如何传递成员函数而不是函数?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 在单元测试中,如何在不使用 operator== 的情况下比较两个对象,这可能会错过新成员?
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 在这种情况下,工会成员会调用自己的析构函数吗
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 如何在没有setter的情况下设置类内部类的成员变量?
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 类成员在继承的情况下用作模板参数
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 如何在不创建实例的情况下获取类的方法成员的类型?
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- 命名空间:不能在没有对象的情况下调用成员函数
- 在没有显式作用域的情况下无法访问模板基类的静态成员
- C :在没有对象实例的情况下调用非静态成员函数