2013-04-07 3 views
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); 
} 

하지만 오류가있어 : 매개 변수를 사용하여 확장되지 팩 '...'내가 잘못하고있는 중이 야 무엇

를?

+0

' (pos - 1, t.Tail())을 얻으면,'-'꼬리'는 여기에있는 유형이므로 작동하지 않습니다. – 0x499602D2

+0

많은 sooooo 감사합니다! 나는 지금 행복하다! – krems

+0

'enable_if' 또는 템플릿 전문화를 사용해야합니다. 첫 번째'Get' 함수는 런타임 조건에 따라'T' 또는'Head'를 반환합니다 - 불가능합니다. – mfontanini

답변

0

그게 전부입니다. 템플릿 전문화를 사용하여 구현했지만 기능 부분 전문화의 장애로 인해 위의 tuple_element 구조체를 수정했습니다. 그것이 내가 마침내 얻은 것입니다.

template<size_t I, class T> 
struct TupleElement; 

template<size_t I, class Head, class ... Rest> 
struct TupleElement<I, Tuple<Head, Rest...> >: 
    public TupleElement<I - 1, Tuple<Rest...> > { 
    static typename TupleElement<I, Tuple<Head, Rest...> >::Type 
     Get(const Tuple<Head, Rest...>& t) { 
    return TupleElement<I - 1, Tuple<Rest...> >::Get(t.Tail()); 
    } 
}; 

template<class Head, class ... Rest> 
struct TupleElement<0, Tuple<Head, Rest...> > { 
    typedef Head Type; 
    static typename TupleElement<0, Tuple<Head, Rest...> >::Type 
     Get(const Tuple<Head, Rest...>& t) { 
    return t.Head(); 
    } 
}; 

template<size_t Pos, class Head, class ... Rest> 
typename TupleElement<Pos, Tuple<Head, Rest...> >::Type 
    Get(const Tuple<Head, Rest...>& t) { 
    return TupleElement<Pos, Tuple<Head, Rest...> >::Get(t); 
} 

유용한 조언을 주신 모든 분들께 감사드립니다.

관련 문제