1

我在存储 lambda 表达式时遇到问题,将类中的“this”指针作为参数捕获。我像这样制作了typedef:

typedef void(*func)();

下面的代码工作正常。

#include <iostream>
using namespace std;

typedef void(*func)();

class A {
public:
    func f;
};

class B {
public:
    A *a;

    B() {
        a = new A();
        a->f = [](){
            printf("Hello!");
        };
    }
};

int main() {
    B *b = new B();
    b->a->f();
    return 0;
}

还没有捕获,但是当我想在 lambda 中捕获“this”指针时,它会引发错误。如何使用捕获制作 typedef?我想做这样的事情:

#include <iostream>
using namespace std;

typedef void(*func)();

class A {
public:
    func f;
};

class B {
public:
    A *a;

    B() {
        a = new A();

        //There is a problem with [this]
        a->f = [this](){
            //Method from class B using "this" pointer
            this->p();
        };
    }
    void p() {
        printf("Hello!");
    }
};

int main() {
    B *b = new B();
    b->a->f();
    return 0;
}

我究竟做错了什么?请解释一下。谢谢。

4

2 回答 2

5

无法从带有捕获的 lambda 转换为函数指针,因为带有捕获的 lambda 包含比函数指针更多的信息(它不仅包含函数的地址,还包含已捕获的变量) .

更改typedef void(*func)();typedef std::function<void()> func;获取能够保存任何可复制函数类型的东西。

于 2013-02-19T09:02:30.877 回答
3

正如 Angew 上面所说,您应该使用std::function类模板,而不仅仅是函数指针。您的代码将变成这样(从第二个示例复制)

#include <iostream>
#include <functional>
#include <memory>
using namespace std;



class A {
public:
    std::function<void> f;
};

class B {
public:
    shared_ptr<A> a;  // Better ownership

    B() 
     : a(new A())
    {
        // Now this should work
        a->f = [this](){
            //Method from class B using "this" pointer
            this->p();
        };
        // Note, you could just do this instead of a lambda:
        // a->f = bind(b::p, this);
    }
    void p() {
        printf("Hello!");
    }
};

int main() {
    B *b = new B();
    b->a->f();
    return 0;
}

A除了正确的可调用对象之外,我还通过智能指针添加了自动清理,并添加了代码来向您展示如何使用它来执行此操作std::bind

于 2013-02-19T09:15:03.653 回答