C++:遍历一个对象的所有成员?

标签 c++ boost

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

class Example {
    AnotherClass member1;
    AnotherClass member2;
    YetAnotherClass member3;
    ...
};

是否有一种简短/简洁的方法来做类似的事情:

foreach(member m: myExample)
    m.sharedMethod();

而不是单独访问每一个?

我想我可以把它们放在一个 vector 中并使用 shared_ptr 来达到同样的效果,我只是想知道 Boost 或其他一些流行的库是否没有自动执行此操作的功能.

最佳答案

C++ 不支持类自省(introspection),因此您不能像那样遍历类中的所有成员 - 除非没有(手动编写的)函数为您遍历所有成员。

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

template<typename Functor>
void doAllMembers(Functor &f) {
  f(member1);
  f(member2);
  f(member3);
}

也就是说,我会认为这是一个错误的设计;您已经公开暴露了所有内部成员。如果您稍后添加一个会怎样?或者改变一个的语义?使一个有时过时的缓存值?等等。此外,如果您的成员并非都继承自同一类型,会发生什么情况?

退后一步,重新考虑您的设计。

关于C++:遍历一个对象的所有成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142532/

相关文章:

c++ - 如何在 Windows 上使用 C++ 监听终端外的击键

c++ - 如何从 msi 安装中检索详细结果

c++ - 如何划分boost::optional<double>?

vim - 如何通过boost减少clang_complete搜索的时间

c++ - vector 存储限制的 vector - 出现 "Microsoft C++ exception: std::bad_alloc at memory location 0x0031650C."错误

Visual Studio 2017 中的 C++ 版本 98

c++ - 跨编译器的 constexpr 成员函数的重载解析不一致

c++ - 未找到 Boost 库,但编译正常

c++ - 如何将 std::shared_ptr 与 Mysql 准备好的语句一起使用?

c++ - 单字节变量的 boost::program_options