gpt4 book ai didi

c++ - 如何使用 std::function 自动扣除参数和返回类型的 lambda?

转载 作者:行者123 更新时间:2023-12-05 05:33:29 25 4
gpt4 key购买 nike

这段代码:

template<typename Arg, typename Ret>
Ret fun(std::function<Ret(Arg)> fun){
Arg x=0;
return fun(x);
};

auto f=[](int x){return x;};
fun(f); //compilation failed.

没用。我想在 fun 中获取 lambda 的参数和返回类型。

我认为参数类型在编译时就已经知道了,为什么编译器不能自动推导它?

最佳答案

这里的问题是 lambda 不是 std::function,因此您要求编译器进行推导(找到 Arg 的类型并且Ret) 和转换,即将 lambda 转换为 std::function。组合会导致冲突。

如果您仍想使用 std::function 作为 fun 的参数类型,那么更容易做的事情是制作一个实用程序来标识 std::function 将您的可调用对象转换为,例如:

#include <functional>

using namespace std;

template<typename T>
struct memfun_type
{
using type = void;
};

template<typename Ret, typename Class, typename... Args>
struct memfun_type<Ret(Class::*)(Args...) const>
{
using type = std::function<Ret(Args...)>;
};

template<typename F>
typename memfun_type<decltype(&std::decay_t<F>::operator())>::type
function_from(F&& func)
{
return std::forward<F>(func);
}

你会用作

fun(function_from(f)); // Auto-detect <Ret(Args...)> types.

Demo

在展示自动检测如何工作的机制后,请注意,从 C++17 开始,CTAD 功能会为您执行此操作。所以在较新的编译器中这也有效:

fun(std::function(f)); // Again no types specified.

或者,您可以使您的 f 更通用一些,并只使用参数推导,例如:

template <class F>
auto fun(F &&fun)
{
int x=0;
return std::invoke(std::forward<F>(fun), x);
};

fun(f); // Call directly with your lambda

Demo

使用 c++20 概念,此版本可以限制为您想要的参数和输入函数类型。

关于c++ - 如何使用 std::function 自动扣除参数和返回类型的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73836564/

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