我试图打开一个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
.
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>{});
}
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 上编译