如何将方法作为参数传递?

时间:2011-07-27 23:28:46

标签: c++ methods

有这个课程:

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方法,但没有成功。

2 个答案:

答案 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 ++中没有像泛型函数(对象)这样的东西。