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

Passing non-static member function as argument to member function

我正在尝试将 class 的非静态成员函数作为参数传递给另一个采用函数引用的成员函数。我目前的代码可以说明为:

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" 中作为参数传递的函数是非静态的。但是,有没有其他方法可以将非静态成员函数作为我在此处显示的代码中的参数传递?

实现所需功能的一种方法是使用 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

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

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);
}

如果你想使用单个class的non-static方法,只需将参数函数参数的类型更改为成员函数指针

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

请注意,我已将 baseFunction 更改为 non-const,因为它调用了 non-const 成员函数。

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