[英]Iterating over a tuple by index in c++17 on MSVC?
我需要能够在编译时遍历元组,同时在跨平台代码中访问递归索引。 理想情况下,我可以这样做:
#include<tuple>
#include <array>
struct A { int val() { return 1; } };
struct B {
int v;
B( int v): v(v) {};
int val() { return v * 2; }
};
int main() {
auto arr = std::array<int,3>{};
auto t = std::tuple<A,A,B> {A{}, A{}, B{7}};
// set each elem in arr with the result of the corresponding elem in
// t's val() call
[&]<size_t ... d>(std::index_sequence<d...>) {
((arr[d] = std::get<d>(t).val()),...);
}(std::make_index_sequence<3>());
}
但是,这不会在带有 std=c++17 的 MSVC 上编译,而是在 GCC 和 clang 上编译。 Godbolt链接。
我也考虑过std::apply
,但我无法访问索引(除非我以某种方式用index_sequence
折叠我的tuple
?)。 如果我不能很好地使用 fold 表达式,我的下一个选项似乎是编译时递归,但这似乎非常笨拙,特别是如果我不能使用 lambda 函数模板,因为 c++17。
在我走这条路并使我的代码变得非常丑陋之前,是否有一种很好的惯用方法来做我想做的事情,但我错过了?
如果重要的话,在完整代码中,数组和元组的大小是模板参数,元组类型也是如此(尽管它们都派生自基类)。
在 C++17 中,您可以使用嵌套apply
对两个tuple
元素执行成对运算。
auto arr = std::array<int,3>{};
auto t = std::tuple<A,A,B> {A{}, A{}, B{7}};
std::apply([&](auto&... y) {
std::apply([&](auto&... x) { ((x = y.val()), ...); }, arr);
}, t);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.