c++ - 如何在 C++11/14 中实例化 lambda 闭包类型?

标签 c++ performance lambda closures c++14

我是 aware lambda 闭包类型没有默认构造函数。但这是否意味着它作为模板参数传递后就无法实例化了?

考虑以下 minimal example :

#include <iostream>

template <typename FuncType>
std::pair<int,int> DoSomething() {
    return FuncType()(std::make_pair(1,1));
}

int main() {
    auto myLambda = [](std::pair<int,int> x) {
        return std::make_pair(x.first*2,x.second*2);
    };
    std::pair<int,int> res = DoSomething<decltype(myLambda)>();
    return 0;
}

出于性能原因,I can't use std::function避免虚拟指针调用。有没有办法做到这一点?我需要实例化该 lambda 一次并在该函数内多次使用它。

decltype(myLambda) 被传递给模板参数中的类似 std::map 比较器时,标准库如何使其工作?

最佳答案

虽然这个特性在 C++20 中出现(参见 songyuanyao 的回答),但在这种情况下你实际上并不需要它。您可以将 lambda 作为 FuncType 类型的函数参数传递并多次调用:

template <typename FuncType>
std::pair<int,int> DoSomething(FuncType f)
{
    return f(std::make_pair(1,1));
}

int main()
{
    auto myLambda = [](std::pair<int,int> x) {
        return std::make_pair(x.first*2,x.second*2);
    };
    std::pair<int,int> res = DoSomething(myLambda);
}

关于c++ - 如何在 C++11/14 中实例化 lambda 闭包类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56407294/

相关文章:

c++ - 用于比较原始类型的 std::optional 的有趣程序集

c++ - BOOST_SCOPE_EXIT 在幕后做了什么?

c - 一个简单的附加分支会导致性能下降

C++11 Lambda 表达式作为回调函数

c# - Lambda 表达式——将逻辑非应用于 bool 方法调用

java - Java 中的回调与 lambda

c++ - 设置 GtkButton 宽度

c++ - 基于 C++ 中的值从 HashTable 中删除而不使用 STL

php - MySQL查询缓存与应用层缓存结果集

r - 在 R 中查找感染链的方法比 "while"循环更快