c ++指向成员函数的指针,替换__closure

时间:2015-07-26 08:04:03

标签: c++ pointers c++11 closures member-pointers

前一段时间,Borland在他们的BCB环境中引入了C ++语言的扩展。此扩展名是__closure关键字。问题是,如果可以在普通的C ++或C ++ 11中实现这样的功能吗?如果您不熟悉__closure关键字,则下面的代码会在注释中提供说明。

提前致谢! 托雷诺

pthread_cond_wait

2 个答案:

答案 0 :(得分:3)

std::function正是您所寻找的。如果你想学习如何这种机制实际在库中实现,here's就可以发布一系列博客文章。将其与lambda functions结合使用以捕获局部变量。

答案 1 :(得分:0)

使用完整的代码重新哈希前面的答案,对于像我这样想要快速参考通用模式的其他人:

#include <functional>
#include <stdio.h>

// __closure replacement
typedef std::function<void(int x, int y, int z)>    MemberCallback;

class A
{
public:
    void setCallback( MemberCallback newCallback ) {
        callback_ = newCallback;
    }
    void call( int x, int y, int z ) {
        if ( callback_ )
            callback_( x, y, z );
        else
            printf( "NOT SET(%i, %i, %i)\n", x, y, z );
    }

private:
    MemberCallback  callback_;
};

class B
{
public:
    void func1( int x, int y, int z ) {
        printf( "FUNC 1(%i, %i, %i)\n", x, y, z );
    }
    void func2( int x, int y, int z ) {
        printf( "FUNC 2(%i, %i, %i)\n", x, y, z );
    }
};

int main( )
{
    // A and B classes do not know about each other. There is no possibility
    // to for inheritance because B class can implement multiple instances
    // of callback function
    A a;
    B b;

    a.call( 1, 2, 3 );  // Prints: NOT SET(1, 2, 3)

    a.setCallback( [&b](int x, int y, int z){ b.func1(x, y, z); } );
    a.call( 4, 5, 6 );      // Prints: FUNC 1(4, 5, 6)

    a.setCallback( [&b](int x, int y, int z){ b.func2(x, y, z); } );
    a.call( 7, 8, 9 );      // Prints: FUNC 2(7, 8, 9)

    return 0;
}

输出:

NOT SET(1, 2, 3)
FUNC 1(4, 5, 6)
FUNC 2(7, 8, 9)