2016-12-04 1 views
4

내가 풀고 시도한 std::arraystd::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; 
} 

이 그 소리에 작동하지만, g ++ 5.4에서 컴파일에 실패 : no match for ‘operator=’. 컴파일 옵션은 -std=c++11입니다.

  1. gang이 아닌 g ++에서 작동하는 이유는 무엇입니까?
  2. 터플을 풀 수있는 것처럼 std::array을 어떻게 이식 할 수 있습니까?

어떤 도움을 주셔서 감사합니다!

+0

아마도'libC++'구현에 의해 추가로 제공되는 것일까 요? – Arunmu

+0

[Visual Studio 2015에서 컴파일되지 않음] (0120-13755) – PaulMcKenzie

+1

3.2 이상의 버전의 clang에서는 컴파일되지 않습니다. [링크는 명령 행 옵션을 잃어 버리는 것처럼 보이기 때문에'-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>{}); 
} 

그리고이 좋아 사용 : integer_sequence을 구현하지만 필요 ++ (11) C에서

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

가 나오지 않는 한 상자에 표준 ...

Here 당신은 완전한 C++ 11 해결책을 찾을 수 있습니다.

편집 :

배열 불필요한 복사를 방지 할 수있는 몇 가지 더 복잡한 개체를 포함합니다.

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에도에 컴파일 const와 당신이 수까지 간단한 넥타이 배열 요소가 당신을 귀찮게하지 않는 경우 대신 make_tuple 당신이 또는 const를 참조 튜플을 사용할 수 있음을 수행하려면