C++:迭代所有对象的成员?

vvv*_*vvv 7 c++ boost

假设我有一个包含许多成员的对象:

class Example {
    AnotherClass member1;
    AnotherClass member2;
    YetAnotherClass member3;
    ...
};
Run Code Online (Sandbox Code Playgroud)

是否有简短的方法来做类似的事情:

foreach(member m: myExample)
    m.sharedMethod();
Run Code Online (Sandbox Code Playgroud)

而不是单独访问每一个?

我想我可以将它们放在一个向量中并使用一个shared_ptr相同的效果,我只是想知道是否说,Boost或其他一些流行的库没有自动执行此操作.

bdo*_*lan 12

C++不支持类内省,所以你不能迭代类中的所有成员 - 不管没有(手动编写)函数,无论如何都会迭代所有成员.

原则上,您可以像这样添加模板成员:

template<typename Functor>
void doAllMembers(Functor &f) {
  f(member1);
  f(member2);
  f(member3);
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我认为这是一个破碎的设计; 你已经离开并公开了所有内部成员.如果您稍后添加一个会怎么样?或者改变一个语义?使一个缓存的值有时会过时?等等,如果您的成员并非都从相同的类型继承,会发生什么?

退一步重新考虑你的设计.


Mat*_* M. 6

这个问题有几种解决方案,与反对者的言论相反,但没有内置方式.

C++在编译时支持有限的内省:您可以检查模板参数.

使用Boost.TupleBoost.Fusion(对于它的地图),你确实可以实现你想要的.在Boost.Fusion中,您甚至可以使用BOOST_FUSION_ADAPT_STRUCT将基本结构转换为Fusion序列(从而迭代它).

它需要相当多的模板元编程.