如何传递一个方法作为参数?

有这个课程:

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