将非静态成员函数作为参数传递给成员函数

时间:2018-04-09 13:10:32

标签: c++ class pass-by-reference

我试图将一个类的非静态成员函数作为参数传递给另一个带有函数引用的成员函数。我目前的代码可以说明为:

bool someClass::baseFunction( unsigned argument, bool (&argumentFunction)(unsigned) ) const{
    ...
    ... use argumentFunction(argument) somehow...
    ...
}

bool someClass::anotherFunction(unsigned) const{
    ...
}

bool someClass::finalFunction(unsigned argument) const{
    return baseFunction(argument, anotherFunction);
}

然而,这会提示编译器错误

"invalid use of non-static member function"

,我明白这是因为我在##; finalFunction"内传递的函数是一个参数。是非静态的。但是有没有其他方法将非静态成员函数作为参数传递给我在这里显示的代码?

3 个答案:

答案 0 :(得分:1)

如果您要在与调用成员函数对象相同的对象上调用成员函数,那么一个简单的指向成员的指针应该可以解决这个问题:

bool someClass::anotherFunction(unsigned int) { /* ... */ }

bool someClass::baseFunction(
    unsigned int argument,
    bool (someClass::* mf)(unsigned int) const) const {
  return (this->*mf)(argument);
}

bool someClass::finalFunction(unsigned argument) {
  return baseFunction(argument, &someClass::anotherFunction);
}

答案 1 :(得分:0)

实现所需功能的一种方法是使用std::function而不是成员函数指针。它想要这样的东西:

bool someClass::baseFunction(unsigned argument, std::function<bool (unsigned) const> argumentFunction) const {
    argumentFunction(argument);
}

bool someClass::anotherFunction(unsigned){
    /// ...
}

bool someClass::finalFunction(unsigned argument) {
    return baseFunction(argument, [this](unsigned arg){ this->anotherFunction(arg); });
}

请注意,在您的情况下,参数始终相同,因此您也可以在lambda中捕获它,并且根本不会将argument传递给baseFunction

答案 2 :(得分:0)

如果想要使用单个类的非静态方法,只需将参数函数参数的类型更改为成员函数指针

bool someClass::baseFunction(unsigned argument,
                             bool (someClass::*argumentFunction)(unsigned))
{
    // use argumentFunction(argument) somehow...
    return (this->*argumentFunction)(argument);
}

请注意,我已将baseFunction更改为非const,因为您已调用非const成员函数。

bool someClass::finalFunction(unsigned argument){
    return baseFunction(argument, &someClass::anotherFunction);
}