【问题标题】:Using std::function with inherited classes将 std::function 与继承的类一起使用
【发布时间】:2020-04-07 21:37:04
【问题描述】:

我在一些功能性回调方面遇到了一点问题。如何定义一个函数,以便我可以拥有派生 x 的 f,并将其分配给派生,但鉴于函数对象需要基类。 这可以做到吗?这在逻辑上是有道理的。也许我错过了某种形式的指针用法?

这是我正在使用的实际软件的简化形式,可作为可复制的基础。

#include <functional>
#include <iostream>

class base {
public:
 std::function<void(base*)> foo;    
};

class derived : public base {
public:
//EDIT:Would this work?
 std::function<void(derived*)> foo;
 int bar = 0;
};

void f(derived* x)
{
    x->bar++;
}

int main()
{
   derived d;
   d.foo = f; //Issue no matching operator, LHS std::function<void(base)> , RHS void(derived)   

   d.foo(&d); //No match for call to std::function<void(base)>
   std::cout << d.bar;
}

编辑:修复了调用,因为愚蠢的错误,还稍微调整了可能有效的方法?

【问题讨论】:

  • 想想你是否将derived2传递给foo
  • 在您的电话d.foo(); 中,您缺少参数。此外,function&lt;void(base)&gt; 表示函数对象应该可以使用 base 对象调用,但您尝试为其分配的函数需要 derived 对象。如何从base 对象中获取derived 对象?这种逻辑有些不对劲。
  • 您的错误信息不再与代码匹配...尤其是,现在您有 2 个 foo 成员...
  • 仅仅因为你在使用std::function 并不意味着你在做“函数式编程”。为什么要加那个标签?

标签: c++ functional-programming stl


【解决方案1】:

我不确定我是否完全理解你想要什么,但是电话

  d.foo();

不起作用,因为它需要一个 base 类型的参数。您可以通过将 foo 定义为不带参数来解决这个问题。

class base {
public:
 std::function<void(void)> foo; 
}; 

main 中的调用必须重写为


int main()
{
   derived d;
   d.foo = [&d]{ f(d); };
   ...
}

这可行,但可能不是您想要的。查看实时示例here;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多