2017-12-07 9 views
2

가 어떻게 나는 그것이 [] 연산자 (또는 다른 방법)에 의해 요소의 액세스 할 수있는 방법으로 일반적인 배열C와 같은 전문

template <class T, std::size_t N> 
struct Data<T[N]> {} 

의 템플릿을 작성할 수 있습니다 배열 템플릿?

#include <fstream> 
#include <iostream> 
#include <sstream> 
#include <utility> 

template <typename T> 
struct Data; 

template <typename T> 
std::ostream& operator<<(std::ostream& os, const Data<T>& val) { 
    return val(os); 
} 

template <typename T> 
Data<std::remove_cv_t<T>> data(const T& val) { return { val }; } 

template <> 
struct Data<int> { 
    std::ostream& operator()(std::ostream& os) const { 
     os << val; 
     return os; 
    } 
    const int& val; 
}; 

template <class T, std::size_t N> 
struct Data<T[N]> { 
    std::ostream& operator()(std::ostream& os) const { 
     for (std::size_t i = 0; i < N; i++) { 
      os << data(val[i]); 
     } 
     return os; 
    } 
    T val; 
}; 

액세스하는 동안 오류 :

error: subscripted value is not an array, pointer, or vector 
        os << data(val[i]); 
           ^~~ ~ 

내가 배열에 대한 참조를 잡으려고 <T(&)[N]> 같은 뭔가를 <T[N]>을 변경해야합니다 것 같다,하지만 난 그것을 밖으로 작동하지 않을 수 있습니다. 어쩌면 T val;T* val;에 있어야합니다. 배열이 포인터에 퇴화되어 있기 때문에 "catch"할 수 있습니까?

EDIT 1

T val[N];에 대한 오류는 다음과 같습니다

error: cannot initialize an array element of type 'int' with an lvalue of type 'int const[2]' 
Data<std::remove_cv_t<T>> data(const T& val) { return { val }; } 
                ^~~ 

편집 2

그때

template <typename T, size_t N> 
struct Data<std::array<T, N> > 

를 사용하려고 그것은 어떤 템플릿에도 해당하지 않습니다.

error: implicit instantiation of undefined template 'PrettyPrint::Data<int [2]>' 
    sstream << PrettyPrint::data(val); 
      ^
+0

'T val [N]'에서 오류를 추가했습니다. – Davar

+0

내부'Data ''T'는'int [42]'가 아니라'int'입니다. –

+0

그렇다면 int [42]의 형식을 어떻게 공식화 할 수 있습니까? – Davar

답변

1

올바른 템플릿은

template <typename T, std::size_t N> 
struct Data<T[N]> { 
    std::ostream& operator()(std::ostream& os) const { 
     for (std::size_t i = 0; i < N; i++) { 
      os << data(val[i]); 
     } 
     return os; 
    } 
    const T(&val)[N]; 
}; 

const T(&val)[N]; 이유는 무엇입니까? 나는 포인터에 대한 배열 퇴보와 대조적으로 참조를 잡는 것에 대해 생각하고 있지만 누군가가 내게 더 깊이 설명해 주면 정말 기뻐할 것입니다.