繁体   English   中英

在 MSVC 上的 c++17 中按索引迭代元组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM