Вывести пакет параметров из аргумента по умолчанию - PullRequest
1 голос
/ 20 октября 2019

Возможно ли, чтобы компилятор выводил пакет параметров из аргумента функции по умолчанию? В частности, у меня есть следующий код:


template <int ... Is> struct seq {};
template <int ... Is> struct make_seq;
template <int head, int ... tail>
struct make_seq<head, tail...>
{
    using type = typename make_seq<head - 1, head - 1, tail...>::type;
};
template <int ... Is>
struct make_seq<0, Is...>
{
    using type = seq<Is...>;
};
template <int N>
using make_seq_t = typename make_seq<N>::type;

template<int N, int ...Is>
int deduceParamPack(seq<Is...> s = make_seq_t<N>{})
{
    return sizeof...(Is);
}

int main()
{
    return deduceParamPack<5>();
}

И компилятор выводит пакет параметров как пустой и пытается привести к нему аргумент по умолчанию. Вместо этого я хотел бы добиться аналогичного поведения:

int main()
{
    return deduceParamPack<5>(make_seq_t<5>{});
}

, где выводимый пакет параметров равен 0,1,2,3,4, без явной передачи этого аргумента.

1 Ответ

1 голос
/ 20 октября 2019

Возможно ли, чтобы компилятор выводил пакет параметров из аргумента функции по умолчанию?

Нет, насколько я знаю.

Но ... нетименно то, что вы спросили ... но, возможно, вы найдете полезным следующее решение, основанное на частичной специализации структур

template <std::size_t N, typename = std::make_index_sequence<N*N>>
struct deduceParamPackStruct;

template <std::size_t N, std::size_t ... Is>
struct deduceParamPackStruct<N, std::index_sequence<Is...>>
 {
   static constexpr std::size_t func ()
    { return sizeof...(Is); }
 };

. Вы можете использовать его следующим образом:

static_assert( 25 == deduceParamPackStruct<5>::func() );
...