В C ++ в качестве параметра шаблона можно использовать тип, например:
template <typename T>
void MyFn();
В некоторых случаях в качестве параметра шаблона также можно использовать не тип, например:
template <int64_t T>
void MyFn2();
Мой вопрос: возможно ли иметь шаблонный шаблон «generi c», который может быть и тем, и другим? Например:
template <TypenameOrint64_t T>
void MyFn3();
, так что MyFn3<42>
и MyFn3<double>
будут приемлемы.
Пример того, как я мог бы использовать это:
template <typename ValType, ValType Head, ValType ...Tail>
struct ListS{
template <typename OutType, template <ValType ArgType> class Fn>
using MapHead = ListS<OutType, Fn<Head>::val, Tail...>;
};
template<int64_t N>
struct SquareS{
static constexpr const int64_t val = N * N;
};
using Sqrd = ListS<int64_t, 3, 4>::MapHead<int64_t, SquareS>;
static_assert(std::is_same<Sqrd, ListS<int64_t, 9, 4>>::value, "Values don't match");
выше приведен очень грубый набросок списка значений во время компиляции вместе с единственной «функцией» времени компиляции. Можно ли сделать что-то подобное, поддерживающее списки типов, а не просто списки значений, не совместимых с параметрами типа шаблона, без дублирования всего кода?