gpt4 book ai didi

c++ - 如何返回 lambda 对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:50 24 4
gpt4 key购买 nike

我想从函数返回一个 lambda 对象,而不是将其强制转换为函数指针或函数对象。更具体地说,我想让客户端决定是转换为函数对象还是将 lambda 保留为匿名函数:

template<typename F> // F may be a std::function, boost::function, or lambda object
auto func(F f) -> decltype(???) // what do I put in here?
{
return [=]()
{
return f(someParameter);
}
}

此代码不起作用,因为我不知道要推断出什么类型。一种选择可能是将 lambda 的主体复制到 decltype 调用中。当然有更好的方法!

我想这样做的原因是我想保留编译器更智能地内联或展开 lambda 的可能性。这个推理有意义吗?如果是这样,为什么以及什么时候返回 std::function 更好?这种方法在编译时会变慢吗?

最佳答案

在 C++11 中你不能这样做。你可以做一些接近它的事情,但不是这个。

基本上,提取 C++11 lambda 类型的唯一方法是从该类型的实例中推导出它,并且您不能在未计算的上下文中命名该类型。因此,函数不能返回其类型取决于 lambda 类型的类型。 (除非在函数声明之前声明了 lambda 和 body,这在这种情况下没有用)。您可以编写作为手动函数对象的仿函数,或使用为您执行此操作的 std::bind

你可以让它计算你也通过 lambda 传入的其他一些仿函数,但这会变得很尴尬(尤其是在 C++11 中,这样的仿函数要么必须键入删除,要么必须是一个老式的仿函数,写成“手动”作为 structclass)。

然而,C++1y 中添加的一个特性使其变得简单:

template<typename F, typename T>
auto func(F f, T t) {
return [=]() {
return f(t);
};
}
int main() {
auto f = func( [](int x){ std::cout << x << "\n"; }, 7 );
f();
f();
}

Live example

您的编译器可能已经支持此功能的 C++1y。

关于c++ - 如何返回 lambda 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22826656/

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