【发布时间】:2019-02-11 22:59:41
【问题描述】:
有没有人知道在 C++17 / 20 中迭代元组的好方法?假设我们有一些这样的代码:
class Test
{
public:
Test( int x ) : x_(x) {};
void Go() const { std::cout << "Hi!" << x_ << "\n" ; }
int x_;
};
int main()
{
std::tuple tplb{ Test{1} , Test{2} , Test{3} };
}
我们如何使用最新的 17/20 功能遍历元组并在每个元组上调用 Go() 方法?
我知道你可以只拥有一个对象的向量,然后它就可以轻松工作。我的目标是能够拥有某种多态性而不必使用虚函数。
这个想法是能够在元组中拥有支持相同方法的其他对象类型。如果该方法存在于每个对象中,则代码将编译和执行,而无需使用基类、虚拟对象、vtable 等。
std::apply 或 std::invoke 有什么办法吗?
【问题讨论】:
-
@mistertribs 这个问题是关于 C++11 的,所以它现在已经过时了。
-
@Brian - 不过那里的一些答案适用于 C++17。
-
是的,我认为/希望在 17/21 中有一些新的结构可以让这变得非常优雅。在没有虚拟的情况下在编译时强制执行这样的多态性有多酷?并且没有五页难以阅读的模板工作。
-
@mistertribs 我同意,特别是 xskxzr 的答案明确针对 C++17。但我认为这个问题不应该被标记为与那个问题重复。
-
我确实读过那个 - 我希望有一些更好的 c++17/21 解决方案,允许直接调用元组中的对象的方法。