В GCC 4.6.1 у меня работает следующее:
#include <functional>
int foo() { return 5; }
int goo(double, char) { return 5; }
int main()
{
std::function<void()> f = foo;
std::function<void(float, int)> g = goo;
(void)f();
(void)g(1.0f, 'a');
}
Вот обертка, использующая лямбды, но она еще не автоматизирована
template <typename T, typename ...Args>
struct strip_return
{
static inline std::function<void(Args...)> make_function(std::function<T(Args...)> f)
{
return [&f](Args... args) -> void { f(args...); };
}
};
int main()
{
auto q = strip_return<int>::make_function(std::bind(foo));
q();
}
Забудьтесредняя часть.Хорошо, поскольку std::function
- это стирание типов, трудно найти базовые типы.Однако, если вы перейдете непосредственно к ссылке на функцию, вы можете полностью избежать этих проблем:
template <typename T, typename ...Args>
static inline std::function<void(Args...)> make_direct(T (&f)(Args...))
{
return [&f](Args... args) -> void { f(args...); };
}
int main()
{
auto p = make_direct(foo);
q();
}