解压 std::array

问题描述 投票:0回答:2

我尝试通过

std::array
打开
std::tie
的包装:

#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 中无法编译:

no match for ‘operator=’
。编译选项为
-std=c++11
.

  1. 为什么这在 clang 中有效,但在 g++ 中无效?
  2. 我怎样才能像解包元组一样便携式地解包
    std::array

感谢您的帮助!

c++ c++11 stl
2个回答
8
投票

我会创建专用函数来将数组转换为元组。 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
,因为它在标准中不是开箱即用的...

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

编辑:

如果数组包含一些更复杂的对象,您可能希望避免不必要的复制。要做到这一点,而不是

make_tuple
,您可以使用常量引用的元组,或者如果常量不打扰您,您可以简单地将数组元素绑定在一起:

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:

这个也可以在VS上编译


0
投票

与 C++17 的结构化绑定(也适用于 Visual Studio 2017~):

std::array<int, 3> arr{1, 2, 3};
auto & [a, b, c] = arr;

尝试 godbolt.org

© www.soinside.com 2019 - 2024. All rights reserved.