5

考虑以下代码:

//this is what I want to call; I cannot modify its signature
void some_library_method(void(*fp)(void));

class Singleton{
    public:
        static Singleton *instance();
        void foo();
        void bar();
    private:
        Singleton();
};

void Singleton::foo(){
    //this leads to an error ('this' was not captured for this lambda function)
    void(*func_pointer)(void) = []{
        Singleton::instance()->bar();
    };
    some_library_method(func_pointer);
}

我想调用一个我无法修改的函数(见some_library_method上文),它需要一个函数指针作为参数。调用应该在类成员中完成foo()。我知道我不能在那里访问类成员,但我想做的就是以静态方式访问单例类(检索单例实例)。

有什么方法可以修改 lambda 表达式以显示目标编译器 g++ v4.7.2,它真的不需要引用this吗?

4

2 回答 2

2

以下解决方法有效:

template< typename T > T* global_instance() { return T::instance(); }

void(*func_pointer)(void) = []{
    global_instance<Singleton>()->bar();
};
于 2013-10-22T10:08:39.493 回答
1

您可以使用本地定义的常规函数​​而不是 lambda

void Singleton::foo() {
    struct T {
        static void cb(){ Singleton::instance()->bar(); }
    };
    some_library_method(T::cb);
}
于 2013-10-22T10:14:40.880 回答