如何传递一个方法作为参数?
有这个课程:
class Automat
{
private:
// some members ...
public:
Automat();
~Automat();
void addQ(string& newQ) ;
void addCharacter(char& newChar) ;
void addLamda(Lamda& newLamda) ;
void setStartSituation(string& startQ) ;
void addAccQ(string& newQ) ;
bool checkWord(string& wordToCheck) ;
friend istream& operator >> (istream &isInput, Automat &newAutomat);
string& getSituation(string& startSituation) ;
};
还有一个叫做Menu
类,它有以下方法:
void Menu::handleStringSituations(string &stringOfSituation , Automat* autoToHandle ,void (Automat::*methodToDo) () )
{
// some code ...
(*autoToHandle).*methodToDo() ;
}
该行(*autoToHandle).*methodToDo() ;
给出错误。
正如你所看到的,我试图从Automat
类的任何方法作为参数传递给handleStringSituations
方法,但没有成功。
你试图做的通常被称为闭包,这是一个函数式编程的强大概念。 我建议你不要重新发明轮子,而应考虑Boost :: Phoenix,它在一个很好的,同行评审的图书馆中提供。
http://www.boost.org/doc/libs/1_47_0/libs/phoenix/doc/html/index.html
但是,由于C ++是一种静态类型语言,因此您必须进行一些编组。 在C ++中没有像通用函数(对象)那样的东西。
你会怎样称呼它? C ++不是一种动态类型的语言; 它是静态类型的。 因此,您调用的所有内容都必须具有一组特定的参数,并且必须键入每个参数。 没有办法用一些参数调用“某个函数”,并希望能够在运行时对它进行排序。
你需要一个特定的接口。 methodToDo
需要有某种接口; 没有人,你不能称它。
您可以做的最好的方法是使用多个版本的handleStringSituations
,其中每个版本都采用不同的成员指针类型:
void handleStringSituations(string &stringOfSituation , Automat* autoToHandle ,void (Automat::*methodToDo) ()) ;
void handleStringSituations(string &stringOfSituation , Automat* autoToHandle ,void (Automat::*methodToDo) (string&)) ;
void handleStringSituations(string &stringOfSituation , Automat* autoToHandle ,void (Automat::*methodToDo) (Lamda&)) ;
链接地址: http://www.djcxy.com/p/53903.html
上一篇: How to pass a method as parameter?
下一篇: Assertion on mutex when using multiple threads and mutexes