有这个课程:
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
方法,但没有成功。
答案 0 :(得分:3)
你怎么称呼它? 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&)) ;
答案 1 :(得分:1)
您尝试做的通常称为闭包,这是一个强大的功能编程概念。我建议你研究Boost :: Phoenix,而不是重新发明轮子,它提供了一个很好的,经过同行评审的库。
http://www.boost.org/doc/libs/1_47_0/libs/phoenix/doc/html/index.html
但是,由于C ++是一种静态类型语言,因此您必须进行一些编组操作。在C ++中没有像泛型函数(对象)这样的东西。