虽然重构了一些遗留的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::functionf= boost::bind(&MyClass::CaseMethod1,this,_1,_2);
当然,这会将它绑定到当前this
指针:如果您愿意,可以使this
成员函数的指针成为显式的第三个参数:
boost::functionf= boost::bind(&MyClass::CaseMethod1,_1,_2,_3);
另一种替代方法可能是使用虚函数和派生类,但这可能需要对代码进行重大更改.
你有一个指向成员的函数.它会解决你的问题.我很惊讶您的"TestSwitch"函数编译,因为调用语法与您可能期望的略有不同.它应该是:
bool res = (this->*CaseMethod)( 999, "hello world" );
但是,您可能会发现boost :: function和boost :: bind的组合使事情变得更容易,因为您可以避免奇怪的调用语法.
boost::functionf= boost::bind(&MyClass::CaseMethod1,this,_1,_2);
当然,这会将它绑定到当前this
指针:如果您愿意,可以使this
成员函数的指针成为显式的第三个参数:
boost::functionf= boost::bind(&MyClass::CaseMethod1,_1,_2,_3);
另一种替代方法可能是使用虚函数和派生类,但这可能需要对代码进行重大更改.