Построить шаблон с переменным числом без знака int рекурсивно

Мне нужна сложная вещь в коде C ++ 2011.
В настоящее время у меня есть метафункция такого рода:

template<unsigned int N, unsigned int M>
static constexpr unsigned int myFunction()

Эта функция может генерировать число на основе N а также M,

Я хотел бы написать метафункцию с вводом N а также M, и это будет рекурсивно построить шаблон Variadic, уменьшив M, Например, вызывая эту функцию с M = 3, Он будет создавать шаблон с вариадным названием List равно :

List... = myFunction<N, 3>, myFunction<N, 2>, myFunction<N, 1>, myFunction<N, 0>

Как это сделать (если это возможно, конечно)?

3

Решение

Вероятно, проще всего использовать существующий генератор пакетов кортежей:

// Idiomatic tuple pack generator using successor method
template<int... I> struct tuple_pack {
using succ = tuple_pack<I..., sizeof...(I)>;
};
template<int N> struct make_tuple_pack {
using type = typename make_tuple_pack<N - 1>::type::succ;
};
template<> struct make_tuple_pack<0> {
using type = tuple_pack<>;
};

Теперь мы можем применить генератор пакетов кортежей, делегируя функции реализации:

template<int N, int M, typename T> struct foo_impl {};
template<int N, int M, int... I> struct foo_impl<N, M, tuple_pack<I...>> {
static void foo() {
int arr[M] = { myFunction<N, M - I>()... };
}
};
template<int N, int M> void foo() {
foo_impl<N, M, typename make_tuple_pack<M>::type>::foo();
}

Если вы предпочитаете вывод параметров функции специализации шаблона класса, это также можно записать так:

template<int N, int M, int... I> void foo_impl(tuple_pack<I...>) {
int arr[M] = { myFunction<N, M - I>()... };
}
template<int N, int M> void foo() {
foo_impl<N, M>(typename make_tuple_pack<M>::type{});
}

Я должен был указать размер массива как int arr[M]; не уверен, требуется ли это для инициализаторов расширения пакета или это ошибка в gcc; в любом случае это не большая проблема.

4

Другие решения

Других решений пока нет …