Мне нужна сложная вещь в коде 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>
Как это сделать (если это возможно, конечно)?
Вероятно, проще всего использовать существующий генератор пакетов кортежей:
// 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; в любом случае это не большая проблема.
Других решений пока нет …