【问题标题】:How do define anonymous functions in C++?如何在 C++ 中定义匿名函数?
【发布时间】:2012-09-11 02:45:48
【问题描述】:

我可以在 C++ 内联中定义函数吗?我说的不是 lambda 函数,不是导致编译器优化的 inline 关键字。

【问题讨论】:

  • 我相信新的 C++11 语法,lambdas 可能会提供类似于您希望实现的东西?
  • 是的,在 C++11 中,要传递一个添加两个整数的整数,它将是 [](int num1, int num2) {return num1 + num2);}
  • 如果我需要:int n = 1==2?function(){return 10;} : -1; 类似的东西怎么办?

标签: c++ function syntax inline


【解决方案1】:

C++11 将lambda functions 添加到语言中。该语言的早期版本(C++98 和 C++03)以及所有当前版本的 C 语言(C89、C99 和 C11)都不支持此功能。语法如下:

[capture](parameters)->return-type{body}

例如,计算向量中所有元素的总和:

std::vector<int> some_list;
int total = 0;
for (int i=0;i<5;i++) some_list.push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x) {
  total += x;
});

【讨论】:

  • int total = std::accumulate(begin(some_list), end(some_list), 0); :)
  • 有什么特别的原因被否决了吗?它很好地回答了这个问题。
  • 代码不是缺少mutable吗? IIRC lambdas 默认捕获为const,所以它应该是[&amp;total](int x) mutable
  • @Grizzly:这仅对按值捕获感兴趣,因为constness 不会通过间接传播。
  • @Desolator :它们位于命名空间 std 中,由 ADL 找到。是的,在这种情况下,它们包装了 some_list.begin()some_list.end()
【解决方案2】:

在 C++11 中,您可以使用闭包:

void foo()
{
   auto f = [](int a, int b) -> int { return a + b; };

   auto n = f(1, 2);
}

在此之前,您可以使用本地类:

void bar()
{
   struct LocalClass
   {
       int operator()(int a, int b) const { return a + b; }
   } f;

   int n = f(1, 2);
}

两个版本都可以引用环境变量:在本地类中,可以添加引用成员,并在构造函数中绑定;对于闭包,您可以在 lambda 表达式中添加 捕获列表

【讨论】:

  • 请记住,您不能在 C++11 之前的模板中使用本地类型。
  • @Xeo:没错,但我不认为这是一个要求......欢迎 OP 澄清。
  • 哦,我不是那个意思。这是一个一般性的提醒,因为你没有提到那个限制。
  • 您的示例都没有形成闭包。不过,第一个示例确实形成了一个匿名函数。
  • @ThomasEding:我想这取决于你对空集的个人倾向。
【解决方案3】:

我不知道我是否理解你,但你想要一个 lambda 函数?

http://en.cppreference.com/w/cpp/language/lambda

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>


    int main()
    {
        std::vector<int> c { 1,2,3,4,5,6,7 };
        int x = 5;
        c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());

        std::cout << "c: ";
        for (auto i: c) {
            std::cout << i << ' ';
        }
        std::cout << '\n';

        std::function<int (int)> func = [](int i) { return i+4; };
        std::cout << "func: " << func(6) << '\n'; 
    }

如果你没有 c++11x 那就试试吧:

http://www.boost.org/doc/libs/1_51_0/doc/html/lambda.html

【讨论】:

    【解决方案4】:

    Pre C++11,如果你想本地化一个函数到一个函数,可以这样做:

    int foo () {
        struct Local {
            static int bar () {
                return 1;
            }
        };
        return Local::bar();
    }
    

    或者如果你想要更复杂的东西:

    int foo (int x) {
        struct Local {
            int & x;
            Local (int & x) : x(x) {}
            int bar (int y) {
                return x * x + y;
            }
        };
        return Local(x).bar(44);
    }
    

    但如果你想要 C++11 之前的真正函数字面量,那是不可能的。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2012-02-27
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多