Перегруженная функция как аргумент вариативной функции шаблона

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

int sumall(int a) { return a; }
int sumall(int a, int b) { return a+b; }

template<typename R, typename... A>
R doit( R(*f)(A...), A... a) {
    return f(a...); }

Я хочу вызвать doit без каких-либо спецификаторов шаблона и без приведения :

cout << doit(sumall, 7, 6) << endl

Это не компилируется, но когда возвращаемые типы недействительны, все работает идеально:

void printsum(int a) { cout << a << endl; }
void printsum(int a, int b) { cout << a+b << endl; }

template<typename... A>
void vdoit( void(*f)(A...), A... a) {
    f(a...); }

// ...
vdoit(printsum, 7, 6);

Можно ли изменить первый шаблон для работы только с модифицирующим шаблоном doit (я хочу сохранить функции sumall и вызов doit )? Я думаю, что это можно сделать, удалив typename R и оставив только template , поскольку R зависит от A ... и f , но я понятия не имею, как показать эту зависимость.

7
задан krdln 30 January 2012 в 16:30
поделиться