gpt4 book ai didi

c++ - 解包 std::array

转载 作者:可可西里 更新时间:2023-11-01 18:37:33 31 4
gpt4 key购买 nike

我试图通过 std::tie 解压一个 std::array:

#include <tuple>
#include <array>

int main() {
std::array<int, 3> arr = {1, 2, 3};
int a, b, c;
std::tie(a, b, c) = arr;
return 0;
}

这在 clang 中有效,但无法在 g++ 5.4 中编译:不匹配“operator=”。编译选项是 -std=c++11

  1. 为什么这适用于 clang 而不是 g++?
  2. 我如何可移植地解包一个 std::array,就像解包一个元组一样?

感谢您的帮助!

最佳答案

我会创建专门的函数来将数组转换为元组。 C++14 代码可能如下所示:

template <class T, std::size_t N, std::size_t... Is>
auto unpack_impl(std::array<T, N> &arr, index_sequence<Is...>) -> decltype(std::make_tuple(arr[Is]...)) {
return std::make_tuple( arr[Is]... );
}

template <class T, std::size_t N>
auto unpack(std::array<T, N> &arr) -> decltype(unpack_impl(arr, make_index_sequence<N>{})) {
return unpack_impl(arr, make_index_sequence<N>{});
}

然后像这样使用它:

std::array<int, 3> arr = {{1, 2, 3}};
int a, b, c;
std::tie(a, b, c) = unpack(arr);

但是在 c++11 中,您需要实现 integer_sequence,因为它不是标准中开箱即用的……

Here你可以找到完整的 c++11 解决方案。

编辑:

如果数组包含一些更复杂的对象,您可能希望避免不必要的复制。要做到这一点而不是 make_tuple 你可以使用 const 引用的元组,或者如果 constness 不打扰你你可以简单地绑定(bind)数组元素:

template <class T, std::size_t N, std::size_t... Is>
auto unpack_impl(std::array<T, N> &arr, index_sequence<Is...>) -> decltype(std::tie( arr[Is]... )) {
return std::tie( arr[Is]... );
}

编辑2:

This one也在 VS 上编译

关于c++ - 解包 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40956062/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com