解压缩std :: array

rid*_*ish 7 c++ stl c++11

我试图打开一个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;
}
Run Code Online (Sandbox Code Playgroud)

这适用于clang,但无法在g ++ 5.4中编译:no match for ‘operator=’.编译选项是-std=c++11.

  1. 为什么这可以用于clang而不是g ++?
  2. 我怎么可以轻松解压缩std::array,就像可能解开一个元组一样?

谢谢你的帮助!

W.F*_*.F. 6

我会创建专用函数来将数组转换为元组。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>{});
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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

然而,在 c++11 中,你需要实现,integer_sequence因为它在标准中不是开箱即用的......

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

编辑:

如果数组包含一些更复杂的对象,您可能希望避免不必要的复制。要做到这一点,make_tuple您可以使用 const 引用的元组,或者如果 constness 不打扰您,您可以简单地将数组元素联系起来:

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]... );
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

这个也在 VS 上编译