5

我想捕获对 lambda 的“引用”,并且我认为函数指针可以解决问题,如下所示:

int (*factorial)(int) = [&](int x){
    return (x < 2)
        ? 1
        : x * factorial(x - 1);
};

但我明白了cannot convert from main::lambda<......> to int(_cdecl *)(int)

那么指向 lambda 的正确方法是什么?

4

3 回答 3

6

由于 lambda 不是无状态的,因此无法将其转换为函数指针。改为使用std::function

std::function<int(int)> factorial  = [&](int x){
  return (x < 2)
      ? 1
      : x * factorial(x - 1);
};
于 2013-06-28T13:47:46.213 回答
5

你已经有了很好的答案。以下只是一个好奇心,但我不建议您使用它。

正如其他人的回答所说,lambdafactorial试图捕获自己,因此它不是无状态的。因此,它不能转换为函数指针。

Lambdas 不需要捕获全局或static对象,所以如果你创建factorial一个全局或static变量,那么你不需要捕获它,这工作正常(gcc 4.7.2)

    #include <iostream>

    typedef int (*function)(int);

    int main() {
        static function factorial = [](int x){
            return (x < 2) ? 1 : x * factorial(x - 1);
        };
        std::cout << factorial(5) << '\n';
    }

您还可以像这样创建工厂:

    #include <iostream>

    typedef int (*function)(int);

    function make_factorial() {
        static function factorial = [](int x){
            return (x < 2) ? 1 : x * factorial(x - 1);
        };
        return factorial;
    }

    int main() {
        auto factorial = make_factorial();
        std::cout << factorial(5) << '\n';
    }

如果您想混淆更多:-)然后消除typedef

    // This is a function returning a pointer to a function taking an int and returning an int.
    int (*(make_factorial)())(int) {
        static int (*factorial)(int) = [](int x){
            return (x < 2) ? 1 : x * factorial(x - 1);
        };
        return factorial;
    }
于 2013-06-28T14:32:11.867 回答
5

这将最接近您已经拥有的:

std::function<int (int)> factorial = [&](int x){
    return (x < 2)
        ? 1
        : x * factorial(x - 1);
};

通常你也可以使用auto,但在这种情况下它不起作用,因为函数是递归的。

于 2013-06-28T13:47:38.990 回答