gpt4 book ai didi

c++ - 按类型实例化 C++ lambda

转载 作者:IT老高 更新时间:2023-10-28 21:47:13 26 4
gpt4 key购买 nike

我想要一种从函数中生成仿函数的方法。现在我尝试通过 lambda 函数包装函数调用并稍后实例化它。但是编译器说 lambda 构造函数被删除了。那么有没有办法编译这段代码呢?或者也许是另一种方式?

#include <iostream>  

void func()
{
std::cout << "Hello";
}

auto t = []{ func(); };
typedef decltype(t) functor_type;

template <class F>
void functor_caller()
{
F f;
f();
}

int main()
{
functor_caller<functor_type>();
return 0;
}

现在我得到这样的编译器错误:

error: use of deleted function  '<lambda()>::<lambda>()'

error: a lambda closure type has a deleted default constructor

我认为唯一的方法是使用宏:

#define WRAP_FUNC(f) \
struct f##_functor \
{ \
template <class... Args > \
auto operator()(Args ... args) ->decltype(f(args...)) \
{ \
return f(args...); \
} \
};

然后

WRAP_FUNC(func);

然后(主要)

functor_caller<func_functor>()

最佳答案

代码没有意义。想象一下,你有一个像这样的捕获 lambda:

{
int n = 0;
auto t = [&n](int a) -> int { return n += a; };
}

默认构造 decltype(t) 类型的对象可能意味着什么?

正如@Matthieu 建议的那样,您可以将 lambda 包装到 function 对象中:

std::function<int(int)> F = t;

或者您可以直接在 lambda(或任何可调用实体)的类型上模板化您的调用站点:

template <typename F>
int compute(int a, int b, F f)
{
return a * f(b); // example
}

用法:int a = 0; for (int i : { 1, 3, 5 }) { a += 计算(10, i, t); }

如果可能的话,第二种风格更可取,因为转换为 std::function 是一个不平凡的、可能代价高昂的操作,通过结果对象的实际函数调用也是如此。但是,如果您需要存储异构可调用实体的统一集合,那么 std::function 可能是最简单、最方便的解决方案。

关于c++ - 按类型实例化 C++ lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072815/

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