Есть ли способ иметь класс, который принимает как нормальные параметры шаблона, так и параметры шаблона шаблона?
, то есть что-то, что будет одинаково хорошо работать, например:
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