2
튜플 클래스가있는 std :: get (std :: tuple)과 같은 것을 구현하고 싶습니다.Variadic 템플릿을 사용하여 Get (Tuple)을 구현했습니다. '...'으로 확장되지 않은 매개 변수 팩이 있습니다. "오류
template<typename ... Types> class Tuple;
template<> class Tuple<> {};
template<typename First, typename ... Rest>
class Tuple<First, Rest...>: private Tuple<Rest...> {
First Member;
public:
Tuple(const First& first, const Rest& ... rest):
Tuple<Rest...>(rest...), Member(first) {}
const First& Head() const {
return Member;
}
const Tuple<Rest...>& Tail() const {
return *this;
}
};
도우미 구조체 tuple_element를 구현했습니다.
template<size_t I, class T>
struct tuple_element;
template<size_t I, class Head, class ... Tail>
struct tuple_element<I, Tuple<Head, Tail...> >:
tuple_element<I - 1, Tuple<Tail...> > {};
template<class Head, class ... Tail>
struct tuple_element<0, Tuple<Head, Tail...> > {
typedef Head type;
};
그러나 Get (Tuple) 기능을 구현하는 방법을 알지 못합니다. 나는 모든 것을 시도했다고 생각합니다. 내 마지막 시도 :
template<class T, class Head, class ... Tail>
T Get(size_t pos, const Tuple<Head, Tail...>& t) {
if (pos > 0) {
return Get<T>(pos - 1, t.Tail());
}
return t.Head();
}
template<size_t Pos, class Head, class ... Tail>
typename tuple_element<Pos, Tuple<Head, Tail...> >::type
Get(const Tuple<Head, Tail...>& t) {
return Get<typename tuple_element<Pos, Tuple<Head, Tail...> >::type>(Pos, t);
}
하지만 오류가있어 : 매개 변수를 사용하여 확장되지 팩 '...'내가 잘못하고있는 중이 야 무엇
를?
' (pos - 1, t.Tail())을 얻으면,'-'꼬리'는 여기에있는 유형이므로 작동하지 않습니다. –
0x499602D2
많은 sooooo 감사합니다! 나는 지금 행복하다! – krems
'enable_if' 또는 템플릿 전문화를 사용해야합니다. 첫 번째'Get' 함수는 런타임 조건에 따라'T' 또는'Head'를 반환합니다 - 불가능합니다. – mfontanini