在 C++17/20 中迭代元组
Iterating over tuple in C++17/20
有谁知道在 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
?
有没有办法
std::apply
或std::invoke
?
std::apply
确实需要折叠表达:
std::tuple tplb{ Test{1} , Test{2} , Test{3} };
std::apply([](const auto&... tests){(tests.Go(), ...);}, tplb);
在这里,我们对tuple
的每个类型值调用方法 Go()
。
这个想法是能够在元组中拥有支持相同方法的其他对象类型。如果该方法存在于每个对象中,则代码将编译和执行,而无需使用基类、虚拟、vtable 等。
所以上面的方法有效。如果你更进一步,根据类型调度到不同的实现,你可以使用 std::visit 示例中overloaded
类:
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
auto f = overloaded {
[](const Test& test) { test.Go(); },
[](double d) { std::cout << d << ' '; },
[](const std::string& s) { std::cout << s << ' '; },
};
std::apply([&](const auto&... e){ (f(e), ...);}, my_tuple);
> 需要一些std::index_sequence
技巧来访问元组的每个成员。
#include <iostream>
#include <tuple>
#include <utility>
class Test
{
public:
Test( int x ) : x_(x) {};
void Go() const { std::cout << "Hi!" << x_ << "n" ; }
int x_;
};
template<typename F, typename T, std::size_t... Index>
void doStuffIndex(F&& action, T const& tup, std::index_sequence<Index...> const&)
{
bool ignore[] = {((std::get<Index>(tup).*action)(), true)...};
}
template<typename F, typename... Obj>
void doStuff(F&& action, std::tuple<Obj...> const& tup)
{
doStuffIndex(action, tup, std::make_index_sequence<sizeof...(Obj)>());
}
int main()
{
std::tuple<Test, Test, Test> tplb{ Test{1} , Test{2} , Test{3} };
doStuff(&Test::Go, tplb);
}
相关文章:
- 在 c++11 中迭代函子元组
- 迭代一组和擦除元素
- 用std :: apply迭代元组元素
- C :优雅地迭代一组数字
- 在 C++17/20 中迭代元组
- 正在对元组进行迭代..再一次
- 在元组中迭代和调用异构函数
- 从向量的 std::元组中迭代选定的向量
- 我可以用openmp迭代C++11 std::元组吗
- 如何对元组进行迭代
- 如何在表达式中迭代命名组
- 可变模板形参和元组迭代
- Boost c++ -动态迭代多数组
- 为不使用元组的自定义映射模拟std::map迭代器
- 迭代一个n元组
- 在c++中对列表中的一对(或元组)的特定项进行迭代
- 如何在c++映射中迭代一组特定的键
- 一元函数,接受迭代器元组并产生基本类型
- 迭代器元组.operator++的实现
- c++ 0x元组没有迭代器