当前位置:  开发笔记 > 编程语言 > 正文

指向C++类方法的指针

如何解决《指向C++类方法的指针》经验,为你挑选了1个好方法。

虽然重构了一些遗留的C++代码,但我发现我可能通过某种方式定义一个可以指向共享相同签名的任何类方法的变量来删除一些代码重复.经过一番挖掘,我发现我可以做以下事情:

class MyClass
{
protected:
    bool CaseMethod1( int abc, const std::string& str )
    {
        cout << "case 1:" << str;
        return true;
    }

    bool CaseMethod2( int abc, const std::string& str )
    {
        cout << "case 2:" << str;
        return true;
    }

    bool CaseMethod3( int abc, const std::string& str )
    {
        cout << "case 3:" << str;
        return true;
    }

public:
    bool TestSwitch( int num )
    {   
        bool ( MyClass::*CaseMethod )( int, const std::string& );

        switch ( num )
        {
            case 1: CaseMethod = &MyClass::CaseMethod1;
                    break;
            case 2: CaseMethod = &MyClass::CaseMethod2;
                    break;
            case 3: CaseMethod = &MyClass::CaseMethod3;
                    break;
        }

        ...

        bool res = CaseMethod( 999, "hello world" );

        ...

        reurn res;
    }
};

我的问题是 - 这是正确的方法吗? 我应该考虑Boost提供的任何东西吗?

编辑...

好吧,我的错误 - 我应该这样调用方法:

bool res = ( (*this).*CaseMethod )( 999, "Hello World" );

Anthony Will.. 8

你有一个指向成员的函数.它会解决你的问题.我很惊讶您的"TestSwitch"函数编译,因为调用语法与您可能期望的略有不同.它应该是:

bool res = (this->*CaseMethod)( 999, "hello world" );

但是,您可能会发现boost :: function和boost :: bind的组合使事情变得更容易,因为您可以避免奇怪的调用语法.

boost::function f=
    boost::bind(&MyClass::CaseMethod1,this,_1,_2);

当然,这会将它绑定到当前this指针:如果您愿意,可以使this成员函数的指针成为显式的第三个参数:

boost::function f=
    boost::bind(&MyClass::CaseMethod1,_1,_2,_3);

另一种替代方法可能是使用虚函数和派生类,但这可能需要对代码进行重大更改.



1> Anthony Will..:

你有一个指向成员的函数.它会解决你的问题.我很惊讶您的"TestSwitch"函数编译,因为调用语法与您可能期望的略有不同.它应该是:

bool res = (this->*CaseMethod)( 999, "hello world" );

但是,您可能会发现boost :: function和boost :: bind的组合使事情变得更容易,因为您可以避免奇怪的调用语法.

boost::function f=
    boost::bind(&MyClass::CaseMethod1,this,_1,_2);

当然,这会将它绑定到当前this指针:如果您愿意,可以使this成员函数的指针成为显式的第三个参数:

boost::function f=
    boost::bind(&MyClass::CaseMethod1,_1,_2,_3);

另一种替代方法可能是使用虚函数和派生类,但这可能需要对代码进行重大更改.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有