首页 > 解决方案 > 如何将元函数应用于可变参数模板类的模板类型?

问题描述

假设我有许多原子结构,每个都有一个inner_type

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作为模板参数:

template<class ...InnerTypeArgPack>
class MyclassAcceptingInnerTypes;

我的特定 api 类已定义,但指定了几个模板类型:

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从第一个声明()自动生成第二种类型(即) ?my_first_class_t

标签: c++c++11variadic-templatestemplate-meta-programmingtypetraits

解决方案


试试这个:

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>);

推荐阅读