2016-12-04 52 views
4

我试图解包std::array经由std::tie开箱一个std ::阵列

#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; 
} 

这工作在铛,但未能以g ++ 5.4编译:no match for ‘operator=’。编译选项是-std=c++11

  1. 为什么这个工作在clang而不是g ++?
  2. 我如何可以轻松地打开一个std::array,就像可能解开元组一样?

感谢您的帮助!

+0

大概是由'libC++'实现提供的东西吗? – Arunmu

+0

[不能在Visual Studio 2015中编译](http://rextester.com/BXYD49474) – PaulMcKenzie

+1

这不会在3.2以后的版本中编译。 [见这里](https://godbolt.org/g/IJzo2c)(加入'-std = C++ 11',因为链接似乎失去了命令行选项) – PaulMcKenzie

回答

1

我会创建专门的函数来将数组转换为元组。 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你可以使用常量引用的元组或者常量性不打扰你你可以简单的领带数组元素了:

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]...); 
} 

EDIT2:

This one还汇编了VS