如何将元函数应用于可变参数模板类的模板类型?

时间:2018-12-18 03:04:06

标签: c++ c++11 variadic-templates template-meta-programming typetraits

让我们假设我有许多原子结构,每个原子结构都有一个Xth

inner_type

我的客户类是可变参数模板,可以使用上述原子类中的1个或多个:

struct Atomic1{
    using inner_type = int;
};
struct Atomic2{
    using inner_type = double;
};
struct Atomic3{
    using inner_type = bool;
};
...

我有一个相关的通用类,它接受template<class ...AtomicTypeArgPack> class MyclassAcceptingAtomicTypes; 作为模板参数:

Atomic*::inner_type

定义了我的特定api类,但指定了两种模板类型:

template<class ...InnerTypeArgPack>
class MyclassAcceptingInnerTypes;

对于每个特定的类,我还具有另一类内部类型:

using my_first_class_t = MyclassAcceptingAtomicTypes<Atomic1, Atomic2>;

是否可以使用模板元编程/元函数从第一个声明(using my_first_class_inner_types_t = MyclassAcceptingInnerTypes<Atomic1::inner_type , Atomic2::inner_type >; )自动生成第二种类型(即my_first_class_inner_types_t)?

2 个答案:

答案 0 :(得分:3)

尝试一下:

template <class Atomics>
struct inner_types;

template <template <class...> class T, class... Atomic>
struct inner_types<T<Atomic...>>
{
    using type = MyclassAcceptingInnerTypes<typename Atomic::inner_type...>;
};


using atomics = MyclassAcceptingAtomicTypes<Atomic1, Atomic2>;
using inners  = MyclassAcceptingInnerTypes<Atomic1::inner_type ,  Atomic2::inner_type >;

static_assert(std::is_same_v<inner_types<atomics>::type, inners>);

答案 1 :(得分:1)

  

是否可以使用模板元编程/元函数从第一个声明(<form action="/action_page.php" method="post"> First name: <input type="text" name="fname"><br> Last name: <input type="text" name="lname"><br> <input type="submit" value="Submit"> </form> )自动生成第二种类型(即my_first_class_inner_types_t)?

您的意思如下吗?

my_first_class_t

您可以验证

template <typename ... Ts>
constexpr auto foo (MyclassAcceptingAtomicTypes<Ts...> const &)
   -> MyclassAcceptingInnerTypes<typename Ts::inner_type...>;

template <typename T>
using bar = decltype(foo(std::declval<T>()));