Как применить мета-функцию к типам шаблонов класса шаблонов с переменным значением? - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, у меня есть множество атомарных структур, каждая из которых имеет 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 >;

Есть ли способ автоматически сгенерировать второй тип (т.е. my_first_class_inner_types_t) из первого объявления (my_first_class_t)использование шаблонов метапрограммирования / мета-функций?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Есть ли способ автоматически сгенерировать второй тип (т.е. 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>{}, "!" );
0 голосов
/ 18 декабря 2018

Попробуйте это:

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