代码之家  ›  专栏  ›  技术社区  ›  motam79

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

  •  1
  • motam79  · 技术社区  · 6 年前

    假设我有许多原子结构,每个都有一个 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 )使用模板元编程/元函数?

    2 回复  |  直到 6 年前
        1
  •  1
  •   max66    6 年前

    是否有方法自动生成第二种类型(即 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>()));
    

    你可以验证一下

    static_assert( std::is_same<bar<my_first_class_t>,
                                my_first_class_inner_types_t>{}, "!" );
    
        2
  •  3
  •   Jans    6 年前

    试试这个:

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