Предположим, что у меня есть следующая функция, которая принимает функцию как параметр.
template <typename F>
void test_func(F f)
{
// typedef typename function_traits<F>::return_type T;
typedef int T;
std::mt19937 rng(std::time(0));
std::uniform_int_distribution<T> uint_dist10(0, std::numeric_limits<T>::max());
f(uint_dist10(rng), uint_dist10(rng)); // Problem!
}
Использование:
int foo(int, int) { return 0; }
int bar(int, int, int, int) { return 0; }
int main()
{
test_func(foo);
// test_func(bar);
}
Так же, как foo
и bar
, у меня есть несколько функций, которые возвращают T
, и берут некоторое количество параметров типа T
. Я хотел бы, чтобы test_func
генерировал столько звонков на мой RNG, как функция f принимает параметры. Другими словами, мы можем предположить, что T
всегда является целым типом и каждый параметр будет одним и тем же, то есть вызовом функции для RNG.
Используя функции function_traits (такие как те, что есть в Boost), я могу получить возвращаемый тип F
, и это немного помогает. Грубо говоря, мой вопрос:
Как я могу генерировать необходимое количество вызовов функций, чтобы он соответствовал арности функции F?
До С++ 11 я бы посмотрел на Boost.Preprocessor или, возможно, полагался на специализированную специализацию. Есть ли лучший способ сделать это сейчас?