Предполагая, что вы хотите объединить свой кортеж и создать его в виде
fun<4>() == tuple(1, 2, 3, 4);
, вы можете написать два шаблона, например
template<int n, std::enable_if_t<n == 1>* = nullptr>
constexpr auto fun()
{
return std::make_tuple(1);
}
template<int n, std::enable_if_t<n != 1>* = nullptr>
constexpr auto fun()
{
return std::tuple_cat(fun<n-1>(), std::tuple(n));
}
Однако это не " C ++ 17 способ " сделать это. Это можно выразить гораздо лучше, используя if constexpr
template<int n>
constexpr auto fun2()
{
if constexpr (n > 1)
return std::tuple_cat(fun2<n-1>(), std::tuple(n));
else
return std::tuple(1);
}
Что касается создания последовательности (например, 1, 2, 3, 4, ...
), существует также std::integer_sequence
, который можно использовать в сочетании с шаблоном пакеты параметров
template <int... nums>
constexpr auto construct(std::integer_sequence<int, nums...>)
{
return std::tuple((nums + 1)...);
}
template<int n>
constexpr auto fun3()
{
return construct(std::make_integer_sequence<int, n>());
}
Здесь - полный пример.