2017-10-26 3 views
2
class A{ typedef tuple<int, double, int> list; }; 
class B{ typedef tuple<int, int> list; }; 
class C{ typedef tuple<int, double, char> list; }; 

template <typename... args> 
    class My_class{ 
      //need a tuple type that is combination of all the tuple named list in the class A B C 
    }; 

    My_class<A, B, C> obj; 

My_class에 typedef를 작성하여 tuple<int, double, int, int, int, int, double, char>과 같도록하려면 어떻게해야합니까?다른 튜플을 연결 한 튜플을 typedef하는 방법은 무엇입니까?

template <typename... Args> 
class My_class{ 
    typedef decltype(tuple_cat(declval<typename Args::list>()...)) list; 
}; 

그것은 추한 보이지만, 불행히도 C++ 표준에서 튜플 타입에 가입 할 수있는 방법이 없다 : 당신은 당신이 원하는, A::list, B::listC::list 공개적으로 액세스 할 수 있습니다 가정

+0

[std :: tuple_cat] (http://en.cppreference.com/w/cpp/utility/tuple/tuple_cat)? – Bernard

답변

2

이다. 당신과 같은 자신의 tuple_flatten을 만들 수 :

template <typename... Tuple> 
struct tuple_flatten{ 
    typedef decltype(tuple_cat(declval<Tuple>()...)) type; 
}; 
template <typename... Tuple> 
using tuple_flatten_t = typename tuple_flatten<Tuple...>::type; 

사용하려면

template <typename... Args> 
class My_class{ 
    typedef typename tuple_flatten<typename Args::list...>::type list; 
}; 

는 또한, 대부분의 규칙에 의해, 형식 매개 변수 (Args)는 대문자로 시작해야합니다.

+0

그것은 나를 위해 작동합니다. 버나드 고맙습니다. –

관련 문제