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::listB::listC::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)应该以大写字母开头。

07-24 09:44
查看更多