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>
? 最佳答案
假设您可以公开访问A::list
,B::list
和C::list
,那么您想要的是:
template <typename... Args>
class My_class{
typedef decltype(tuple_cat(declval<typename Args::list>()...)) list;
};
它看起来很丑陋,但是不幸的是,没有一种方法可以在C++标准中连接元组类型。您可以这样编写自己的
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
)应该以大写字母开头。