如何将元函数应用于variadic模板类的模板类型



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

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

我的客户端类是一个可以使用上述1个或更多原子类的变异模板:

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

是否可以使用模板meta编程/meta函数自动从第一个声明(my_first_class_t)中自动生成第二种类型(即my_first_class_inner_types_t)?

尝试以下:

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

是否可以使用模板meta编程/元函数自动从第一个声明(my_first_class_t)自动生成第二种类型(即my_first_class_inner_types_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>{}, "!" );

最新更新