我如何迭代一个元组(使用C++11)?我尝试了以下几种方法:
for(int i=0; i<std::tuple_size<T...>::value; ++i)
std::get<i>(my_tuple).do_sth();但这不起作用:
错误1:对不起,未实现:无法展开‘Listener...’转换为固定长度的参数列表。
错误2: I不能出现在常量表达式中。
那么,如何正确地遍历元组的元素呢?
发布于 2020-05-31 18:25:36
扩展@Stypox answer,我们可以使他们的解决方案更通用(C++17更高)。通过添加一个可调用的函数参数:
template<size_t I = 0, typename... Tp, typename F>
void for_each_apply(std::tuple<Tp...>& t, F &&f) {
f(std::get<I>(t));
if constexpr(I+1 != sizeof...(Tp)) {
for_each_apply<I+1>(t, std::forward<F>(f));
}
}然后,我们需要一个访问每种类型的策略。
让我们从一些帮助器开始(前两个取自cppreference):
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
template<class ... Ts> struct variant_ref { using type = std::variant<std::reference_wrapper<Ts>...>; };variant_ref用于允许修改元组的状态。
用法:
std::tuple<Foo, Bar, Foo> tuples;
for_each_apply(tuples,
[](variant_ref<Foo, Bar>::type &&v) {
std::visit(overloaded {
[](Foo &arg) { arg.foo(); },
[](Bar const &arg) { arg.bar(); },
}, v);
});结果:
Foo0
Bar
Foo0
Foo1
Bar
Foo1为了完整起见,这里是我的Bar & Foo
struct Foo {
void foo() {std::cout << "Foo" << i++ << std::endl;}
int i = 0;
};
struct Bar {
void bar() const {std::cout << "Bar" << std::endl;}
};https://stackoverflow.com/questions/1198260
复制相似问题