C++11 C++;03相当于C++;11兰姆达

C++11 C++;03相当于C++;11兰姆达,c++11,lambda,c++03,C++11,Lambda,C++03,参考我之前的解释,因为需要详细解释。 下面的代码段工作、基本和C++ 03如何等效?< /P> auto get_option_name = [](const std::pair<const std::string, std::string>& p) -> const std::string& { return p.first; }; auto-get_-option_-name=[](const-std::pair&p)->const-std::

参考我之前的解释,因为需要详细解释。 下面的代码段工作、基本和C++ 03如何等效?< /P>
 auto get_option_name = [](const std::pair<const std::string, std::string>& p) -> const std::string& {
    return p.first;
 };
auto-get_-option_-name=[](const-std::pair&p)->const-std::string&{
返回p.first;
};
它相当于:

class Extractor {
    // Definition of "function call" operator, to use instance
    // of this class like a function
    const std::string& operator()(const std::pair<const std::string, std::string>& p) {
        return p.first;
    }
};

Extractor get_option_name;
类提取器{
//定义“函数调用”运算符,以使用实例
//这个类的函数
常量std::string&operator()(常量std::pair&p){
返回p.first;
}
};
提取器获取\u选项\u名称;
有关或关于

的更多信息相当于:

class Extractor {
    // Definition of "function call" operator, to use instance
    // of this class like a function
    const std::string& operator()(const std::pair<const std::string, std::string>& p) {
        return p.first;
    }
};

Extractor get_option_name;
类提取器{
//定义“函数调用”运算符,以使用实例
//这个类的函数
常量std::string&operator()(常量std::pair&p){
返回p.first;
}
};
提取器获取\u选项\u名称;

更多关于Garf365的信息,Garf365的答案是最好的。lambda和类似的类实际上是最相似的-您可以像可调用函数一样使用它们,并传递指向它们的指针和引用

但是,您可能还想了解如何在编译时使用函数模板来完成这项工作,尤其是在使用boost库时,将它们作为参数传递给另一个模板时

我很好奇,编译器通过使用函数模板生成的代码的复杂性是否有所提高,确实如此

寻找你自己:

  • (或者不管他们叫什么)是187条来自GCC的装配线,237条来自clang的装配线
  • -GCC只有65条装配线,而clang只有84条减少了300%

谢谢你提出这个问题并引导我去研究它

@Garf365的答案是最好的。lambda和类似的类实际上是最相似的-您可以像可调用函数一样使用它们,并传递指向它们的指针和引用

但是,您可能还想了解如何在编译时使用函数模板来完成这项工作,尤其是在使用boost库时,将它们作为参数传递给另一个模板时

我很好奇,编译器通过使用函数模板生成的代码的复杂性是否有所提高,确实如此

寻找你自己:

  • (或者不管他们叫什么)是187条来自GCC的装配线,237条来自clang的装配线
  • -GCC只有65条装配线,而clang只有84条减少了300%

谢谢你提出这个问题并引导我去研究它

这是一个函子。看,这是个函子。请看,此答案不正确-函数对象导致较长程序集的原因是您正在
提取器::operator()
中将
对转换为
对,这需要一个副本。如果您删除
常量
并创建一个临时的
提取器
,则生成的代码是相同的。@rlbond我总是很高兴有更好的方法显示给我。请分享你的答案,这样每个人都能看到最好的方法。我写这个答案已经3.5年了(至今!),所以我想不起所有的细节(我记得当时我在为GCC4.4.7编写代码,所以我不知道为什么我在回答这个问题时使用了不同的版本。哦,好吧!)此答案不正确-函数对象导致较长程序集的原因是您正在
Extractor::operator()
中将
pair
转换为
pair
,这需要一个副本。如果您删除
常量
并创建一个临时的
提取器
,则生成的代码是相同的。@rlbond我总是很高兴有更好的方法显示给我。请分享你的答案,这样每个人都能看到最好的方法。我写这个答案已经3.5年了(至今!),所以我想不起所有的细节(我记得当时我在为GCC4.4.7编写代码,所以我不知道为什么我在回答这个问题时使用了不同的版本。哦,好吧!)