2016-12-04 64 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