Вариативный параметр std :: function в C ++ 11

Функция с именем test принимает в качестве параметра std :: function <>.

template<typename R, typename ...A>
void test(std::function<R(A...)> f)
{
    // ...
}

Но если я сделаю следующее:

void foo(int n) { /* ... */ }

// ...

test(foo);

Компилятор (gcc 4.6.1) сообщает , что нет соответствующей функции для вызова test (void (&) (int)) .

Чтобы последняя строка test (foo) компилировалась и работала правильно, как я могу изменить функцию test () ? В функции test () мне нужно f с типом std :: function <>.

Я имею в виду, есть ли какие-нибудь уловки с шаблоном, позволяющие компилятору определять сигнатуру функции ( foo в примере) и преобразовывать ее в std :: function автоматически?

РЕДАКТИРОВАТЬ

Я хочу, чтобы это работало и для лямбда-выражений (как заявленных, так и не имеющих состояния).

19
задан ildjarn 12 February 2012 в 06:18
поделиться