Я пытаюсь создать функцию-шаблон, в которую можно передать какую-либо другую функцию с любым типом и количеством параметров и привязать ее к std::function
. Мне удалось это сделать:
#include <iostream>
#include <functional>
int foo(int bar)
{
std::cout << bar << std::endl;
return bar;
}
template <typename Ret, typename... Args>
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
{
return f;
}
int main()
{
//auto barp = func(foo); // compilation error
auto bar = func(std::function<void (int)>(foo));
bar (0); // prints 0
}
Я хотел бы просто вызвать auto barp = func(foo);
и определить типы, но эта строка дает следующие ошибки компиляции:
error: no matching function for call to ‘func(void (&)(int))’
auto barp = func(foo);
^
note: candidate is:
note: template<class Ret, class ... Args> std::function<_Res(_ArgTypes ...)> func(std::function<_Res(_ArgTypes ...)>)
std::function<Ret (Args...)> func(std::function<Ret (Args...)> f)
^
note: template argument deduction/substitution failed:
note: mismatched types ‘std::function<_Res(_ArgTypes ...)>’ and ‘int (*)(int)’
auto barp = func(foo);
^
Почему он пытается сопоставить std::function<_Res(_ArgTypes ...)>
с int (*)(int)
? Я чувствую, что мне нужно каким-то образом заставить компилятор расширять _Res(_ArgTypes ...)
до int(int)
, но как?
std::function
?std::function
- это класс стирания типа: он берет информацию о типе того, из чего он создан, и стирает большую часть ее. Вывод типа берет его аргумент, выводит его тип и генерирует код. Вы просите определить, до какого типа нужно что-то стереть. Это похоже на создание доспехов, из которых создается оружие, чтобы стрелять по владельцу; Стирание типа - это противоположность вывода типа во многих смыслах. Это очень редко бывает хорошей идеей. Это возможно, но у C ++ мало причин делать это простым. У вас есть практический пример использования? - person Yakk - Adam Nevraumont   schedule 14.09.2015std::function
для хранения исходной функции. Не уверен, возможно ли это. - person Tarc   schedule 14.09.2015