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);
^
'T val [N]'에서 오류를 추가했습니다. – Davar
내부'Data''T'는'int [42]'가 아니라'int'입니다. –
그렇다면 int [42]의 형식을 어떻게 공식화 할 수 있습니까? – Davar