在c+中访问类成员+; 我在C++中长时间编码后,想知道是否有一种方法可以快速访问一个类的数据成员以供操作。

在c+中访问类成员+; 我在C++中长时间编码后,想知道是否有一种方法可以快速访问一个类的数据成员以供操作。,c++,class-members,C++,Class Members,假设一个类中有大约10个数据成员,该类重载一组运算符(在重载运算符=)时考虑到这一点。现在您需要向类中添加/减去一些数据成员。 有没有一种通用的方法可以实现这一点,而无需转到单个函数并对其进行更改?我正在考虑一种可能性,即以一种循环结构遍历类的所有成员 我正在考虑一种可能性,即以一种循环结构遍历类的所有成员 不,一般来说是不可能的,因为标准C++没有任何运行时反射机制,它允许你通过符号信息访问类成员。 当然,您可以做的是将类成员变量值保存在一种std::map字典中,并使用符号键访问这些值(当

假设一个类中有大约10个数据成员,该类重载一组运算符(在重载运算符=)时考虑到这一点。现在您需要向类中添加/减去一些数据成员。 有没有一种通用的方法可以实现这一点,而无需转到单个函数并对其进行更改?我正在考虑一种可能性,即以一种循环结构遍历类的所有成员

我正在考虑一种可能性,即以一种循环结构遍历类的所有成员

不,一般来说是不可能的,因为标准C++没有任何运行时反射机制,它允许你通过符号信息访问类成员。


当然,您可以做的是将类成员变量值保存在一种
std::map
字典中,并使用符号键访问这些值(当然替换实际的类成员变量)

但这需要值类型为

  • 都是同一类型的
  • 差不多
我正在考虑一种可能性,即以一种循环结构遍历类的所有成员

不,一般来说是不可能的,因为标准C++没有任何运行时反射机制,它允许你通过符号信息访问类成员。


当然,您可以做的是将类成员变量值保存在一种
std::map
字典中,并使用符号键访问这些值(当然替换实际的类成员变量)

但这需要值类型为

  • 都是同一类型的
  • 差不多

因为C++中没有内置反射,因此必须将所有成员列出在某个地方。一种避免反复执行此操作的方法是为每个成员定义一个

方法,该方法将每个成员传递给某个函子:

template <class F>
void for_each_member(F f);
模板
每名成员(F)的资格无效;
现在,您可以轻松地对所有成员应用任意操作,并且每个类只需维护一个成员列表

运行示例:

如果您想对成员的不同子集执行不同的操作,那么必须找到一种方法来将它们分开。可以按类型执行此操作(如示例所示),也可以在
中为每个\u成员
另外传递某种标识符给函子


这里,我使用宏将成员及其名称传递给函子:

,因为C++中没有内置的反射(还),所以你必须把所有成员都列出在某个地方。一种避免反复执行此操作的方法是为每个成员定义一个
方法,该方法将每个成员传递给某个函子:

template <class F>
void for_each_member(F f);
模板
每名成员(F)的资格无效;
现在,您可以轻松地对所有成员应用任意操作,并且每个类只需维护一个成员列表

运行示例:

如果您想对成员的不同子集执行不同的操作,那么必须找到一种方法来将它们分开。可以按类型执行此操作(如示例所示),也可以在
中为每个\u成员
另外传递某种标识符给函子


在这里,我使用一个宏将成员及其名称传递给函子:

那么您想对一组可能发生变化的变量应用相同的操作吗?它们都是同一类型的吗?这是一个模糊的描述。即使是伪代码也能清楚地说明你想要完成的事情。如果我正确地理解了,那么C++就不支持这种反射。如果你提供一个例子,某人可能会对你的特殊情况有一个优雅的解决方案?这将允许您循环指定列表中的每个元素。除非您愿意使用
boost::any
,否则您必须坚持使用对单个类型的引用。@jaggedSpire,不,这样做的目的是减少对源代码的更改量。。。类对象尚未创建,并且该类具有一组数据成员。现在,在定义operator=重载时,如果要添加更多数据成员,则必须手动执行该方法并更改源代码。。所以我在想一种避免的方法,允许在方法中访问这些成员来迭代它们,而不改变这些成员原来是什么?你想对一组可能改变的变量应用相同的操作吗?它们都是同一类型的吗?这是一个模糊的描述。即使是伪代码也能清楚地说明你想要完成的事情。如果我正确地理解了,那么C++就不支持这种反射。如果你提供一个例子,某人可能会对你的特殊情况有一个优雅的解决方案?这将允许您循环指定列表中的每个元素。除非您愿意使用
boost::any
,否则您必须坚持使用对单个类型的引用。@jaggedSpire,不,这样做的目的是减少对源代码的更改量。。。类对象尚未创建,并且该类具有一组数据成员。现在,在定义operator=重载时,如果要添加更多数据成员,则必须手动执行该方法并更改源代码。。因此,我正在考虑一种方法来避免,通过允许访问a方法中的这些成员来对它们进行迭代,而不改变这些成员原来是什么。我不知道
std::any
,所以这太棒了,这可能是用户XY的问题。是的,我想到了类似的事情。基本问题是类成员可以是不同类型的。这就是为什么像“struct”这样的构造在编程的早期非常有用。需要一个w的解决方案吗