2013-03-27 1 views
0

컨테이너 작업.템플릿을 사용한 재귀 유형 상향 교환

A이 컨테이너 인 경우 container_traits<A>::reference_containerA이어야합니다.

RefContainer<C> is_base_of A 인 경우 container_traits<A>::reference_containerC이어야합니다.

다음 코드는이 상영 (또는 내가 말한 것처럼 역 참조)을 수행합니다. 이있는 경우 reference = false 컴파일러가 형식을 확인하고 컴파일하지 못하는 경우에도 문제가 발생합니다.

다른 접근 방법이 있습니까?

#include <iostream> 
using namespace std; 

template<typename C> struct RefContainer; 

template<class C> 
class container_traits 
{ 
    template <typename R> 
    static std::true_type ref_helper(const RefContainer<R>&); 
    static std::false_type ref_helper(...); 
public: 
    constexpr static bool reference = decltype(ref_helper(std::declval<C>()))::value; 
    typedef typename std::conditional<reference, typename C::reference_container, C>::type reference_container; 
}; 

template<typename C> 
struct RefContainer : public C { typedef typename container_traits<C>::reference_container reference_container; }; 
struct Container1 {}; 
struct Container2 {}; 
template<typename C> struct D : public RefContainer<C> {}; 
struct E : public RefContainer<D<RefContainer<Container1>>> {}; 

int main() 
{ 
    container_traits<Container1>::reference_container e; // It is Container1 
    container_traits<RefContainer<Container1>>::reference_container f; // dereference to Container1 
    container_traits<D<Container2>>::reference_container // dereference to Container2 
    container_traits<E>::reference_container h; // dereference to Container1 
    return 0; 
} 

답변

1

그냥 헬퍼 클래스를 메인에서

template<class T, bool der> 
struct hlp 
{ 
    typedef T type; 
} 

template<class T> 
struct hlp<RefContainer<T>, true> 
{ 
    typedef T::reference_container type; 
} 
+0

마지막 2 개 라인을 만드는()이 container1에 도착하지 못했습니다. 이 방법을 사용하면 RefContainer에서 파생 된 클래스가 아니라 RefContainer 만 잡을 수 있기 때문입니다. – Chameleon

+1

@Chameleon이 놓친이 대답을 바 꾸었습니다. std :: conditional 대신 사용하십시오. – kassak