gpt4 book ai didi

c++ - 适用于各种仿函数而无需强制转换的函数包装器

转载 作者:行者123 更新时间:2023-11-30 01:58:30 25 4
gpt4 key购买 nike

我想创建一个函数,它接受一个弱指针和任何类型的仿函数(lambda、std::function,等等)并返回一个新的仿函数,它只在以下情况下执行原始仿函数同时指针没有被删除(所以我们假设有一个具有这种语义的 WeakPointer 类型)。这应该适用于任何仿函数,而无需通过模板参数或强制转换明确指定仿函数签名。

编辑:一些评论者指出,我在我的方法中使用的 std::function 可能根本不需要,lambda 也可能不需要(尽管在我最初的问题中我也忘记提到我需要捕获弱指针参数),因此解决一般问题的任何替代解决方案当然也受到高度赞赏,也许我没有跳出框框思考,而是专注于使用 lambda + std::功能。无论如何,这是我到目前为止所做的尝试:

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 构造函数在 this question 中提出的歧义.无论如何,我尝试了以下帮助程序来捕获任何类型的功能:

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...

我能想到两个解决问题的方法,但都没有实现:

  1. 确保为 lambda 创建了正确的 std::function(或其他 Functor 辅助类型),即具有签名 R(T1) 的 lambda 结果在 std::function(R(T1)) 中以便正确推导 ArgumentTypes...
  2. 不要将 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));
}

最佳答案

您不必使用 lambda。

#include <iostream>
#include <type_traits>

template <typename F>
struct Wrapper {
F f;

template <typename... T>
auto operator()(T&&... args) -> typename std::result_of<F(T...)>::type {
std::cout << "calling f with " << sizeof...(args) << " arguments.\n";
return f(std::forward<T>(args)...);
}
};

template <typename F>
Wrapper<F> wrap(F&& f) {
return {std::forward<F>(f)};
}

int main() {
auto f = wrap([](int x, int y) { return x + y; });
std::cout << f(2, 3) << std::endl;
return 0;
}

关于c++ - 适用于各种仿函数而无需强制转换的函数包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com