Класс, принимающий шаблон или шаблон шаблона params - PullRequest
2 голосов
/ 19 января 2020

Есть ли способ иметь класс, который принимает как нормальные параметры шаблона, так и параметры шаблона шаблона?

, то есть что-то, что будет одинаково хорошо работать, например:

template <typename T>
struct TMP;

или вот так:

template <template <typename> typename T>
struct TMP;

tl; dr , чтобы избежать повторения. Но для более подробного объяснения см. Ниже:

При выполнении метапрограммирования шаблона иногда требуются различные вспомогательные структуры (например, объединение списка типов в один), и вы можете написать такую ​​утилиту для обоих параметров шаблона. и шаблон шаблона params et c, но они практически идентичны, за исключением нескольких символов. Поэтому мне было интересно, есть ли способ устранить избыточность.

Пример:

Вот некоторые TMP для объединения двух списков нормальных параметров шаблона (т.е. двух кортежей)

// merge two tuples types into one
template <typename LHS, typename RHS>
struct tuple_merge;

template <typename... LHS_Params, typename... RHS_Params>
struct tuple_merge<std::tuple<LHS_Params...>,
                   std::tuple<RHS_Params...>> {
  using type = std::tuple<LHS_Params..., RHS_Params...>;
};

Но иногда вы можете работать с параметрами шаблона шаблона, поэтому вы можете сделать для них то же самое, например:

// the container of template template params
template <template <typename> typename...>
struct variadic_of_mono_template {};

// the merger of them
template <typename LHS, typename RHS>
struct mono_template_merge;

template <template <typename> typename... LHS_Params,
          template <typename> typename... RHS_Params>
struct mono_template_merge<variadic_of_mono_template<LHS_Params...>,
                           variadic_of_mono_template<RHS_Params...>> {
  using type =
      variadic_of_mono_template<LHS_Params..., RHS_Params...>;
};

Как вы можете видеть, они практически идентичны. Они отличаются только тем, говорят ли они, что параметр равен typename или template <typename> typename. И если есть много подобных утилит TMP, повторение может стать довольно обширным.

Любой способ избежать повторения?

godbolt

...