【发布时间】:2013-11-12 00:32:06
【问题描述】:
我通过以下方式创建了一个包含std::function 作为成员的模板类:
template<typename Ret, typename... Args>
class Foo
{
private:
std::function<Ret(Args...)> _func;
public:
Foo(const std::function<Ret(Args...)>& func):
_func(func)
{}
};
为了不必指定传递函数的参数和返回类型,我创建了一些make_foo 重载:
template<typename Ret, typename... Args>
auto make_foo(Ret (&func)(Args...))
-> Foo<Ret, Args...>
{
return { std::function<Ret(Args...)>(func) };
}
template<typename Ret, typename... Args>
auto make_foo(const std::function<Ret(Args...)>& func)
-> Foo<Ret, Args...>
{
return { func };
}
但是,我无法创建以 lambda 作为参数的 make_foo 重载:
template<typename Ret, typename... Args>
auto make_foo(??? func)
-> Foo<Ret, Args...>
{
return { std::function<Ret(Args...)>(func) };
}
我只是找不到从 lambda 自动推导出返回类型和参数类型的方法。有没有一种惯用的方法来解决这样的问题?
【问题讨论】:
-
你应该可以用
T(或者F,如果你愿意的话)替换所有的东西。 -
也许可以查看this Boost library。
-
以
std::function为参数的重载足以允许使用 lambda。事实上,您应该将它用作唯一的重载,因为它同时接受 lambda 和函数指针。 -
@0x499602D2 好吧,它does not seem to work 虽然:/
-
@0x499602D2:不适用于 lambda。用户定义的转化次数过多。
标签: c++ templates c++11 lambda std-function