我想创建一个函数,它接受一个弱指针和任何类型的仿函数(lambda,std::function
等等)并返回一个新仿函数,它只在同时没有删除指针时执行原始仿函数(所以我们假设有具有WeakPointer
这种语义的类型)。这应该适用于任何函子,而不必通过模板参数或强制转换明确指定函子签名。
编辑:
一些评论者指出std::function
- 我在我的方法中使用的 - 可能根本不需要,lambda也可能不需要(尽管在我原来的问题中我也忘了提到我需要捕获弱指针参数),所以任何解决一般问题的替代解决方案当然也受到高度赞赏,也许我在框外没有足够的想法,而是专注于使用 lambda + std::function
。无论如何,这是我到目前为止所尝试的:
template<typename... ArgumentTypes>
inline std::function<void(ArgumentTypes...)> wrap(WeakPointer pWeakPointer, const std::function<void(ArgumentTypes...)>&& fun)
{
return [=] (ArgumentTypes... args)
{
if(pWeakPointer)
{
fun(args...);
}
};
}
如果我传递一个 ,则无需显式指定参数类型,这很有效std::function
,但如果我传递一个 lambda 表达式,则失败。我猜这是因为这个问题std::function
中提出的构造函数歧义。无论如何,我尝试了以下帮助程序来捕获任何类型的功能:
template<typename F, typename... ArgumentTypes>
inline function<void(ArgumentTypes...)> wrap(WeakPointer pWeakPointer, const F&& fun)
{
return wrap(pWeakPointer, std::function<void(ArgumentTypes...)>(fun));
}
这现在适用于没有参数但对其他参数失败的 lambda,因为它总是ArgumentTypes...
用空集实例化。
我可以想到两个解决问题的方法,但没有设法实现其中任何一个:
- 确保
std::function
为 lambda 创建了正确的(或另一个 Functor 帮助器类型),即带有签名的 lambdaR(T1)
导致 astd::function(R(T1))
以便ArgumentTypes...
正确推断 - 不要把它
ArgumentTypes...
作为模板参数,而是有一些其他的方式(提升?)从 lambda/functor 获取参数包,所以我可以做这样的事情:
-
template<typename F>
inline auto wrap(WeakPointer pWeakPointer, const F&& fun) -> std::function<void(arg_pack_from_functor(fun))>
{
return wrap(pWeakPointer, std::function<void(arg_pack_from_functor(fun))(fun));
}