我尝试通过
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
.
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
,因为它在标准中不是开箱即用的...
在这里你可以找到完整的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上编译
与 C++17 的结构化绑定(也适用于 Visual Studio 2017~):
std::array<int, 3> arr{1, 2, 3};
auto & [a, b, c] = arr;