【问题标题】:Passing non-static member function as argument to member function将非静态成员函数作为参数传递给成员函数
【发布时间】:2018-09-18 21:40:34
【问题描述】:

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

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::functionstd::bindlambda expressions 一起使用。
  • 是否需要支持传入的任何函数,或者只是someClass的其他成员?
  • 我只需要对“someClass”成员的支持,并且我只想传递调用 finalFunction 的对象的成员函数。
  • 你不能把非静态成员函数当作普通函数,因为它们需要绑定到一个对象。传递 lambda 或 std::function

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


【解决方案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);
}

【讨论】:

  • 啊,你打败了我。虽然,我认为你的 const 资格是一个问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 在我的代码中,所有函数都是 const,我忘记为我的问题中的最后两个函数添加它,我现在解决了这个问题。
  • 我还想知道,有没有办法通过引用成员函数来执行您在此处显示的操作?还是只有指针才有可能?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多