假设我有一个包含许多成员的对象:
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)
也就是说,我认为这是一个破碎的设计; 你已经离开并公开了所有内部成员.如果您稍后添加一个会怎么样?或者改变一个语义?使一个缓存的值有时会过时?等等,如果您的成员并非都从相同的类型继承,会发生什么?
退一步重新考虑你的设计.
这个问题有几种解决方案,与反对者的言论相反,但没有内置方式.
C++在编译时支持有限的内省:您可以检查模板参数.
使用Boost.Tuple
或Boost.Fusion
(对于它的地图),你确实可以实现你想要的.在Boost.Fusion中,您甚至可以使用BOOST_FUSION_ADAPT_STRUCT将基本结构转换为Fusion序列(从而迭代它).
它需要相当多的模板元编程.