具有多态性的std::bind和std::function,基类。

我试图将一个对象绑定到一个函数上,但是base的类函数正在被调用.这段代码它只是一个真实代码的例子.我将在真正的代码中只有后面的字符串。

 class A {
    public:
        virtual void f(const std::string &s) {
            std::cout << "A " << s << std::endl;
        }
    };

    class B : public A {
    public:
        void f(const std::string &s) override {
            std::cout << "B " << s << std::endl;
        }
    };

    void main() {
        std::unique_ptr<A> a = std::make_unique<B>();

        std::function<void(const std::string &)> callback
                =  std::bind(&A::f, *a, std::placeholders::_1);
        callback("my string");
    }

结果是

 A my string

我试着把它改成&B:f,但得到一个错误。

No viable conversion from 'typename _Bind_helper<__is_socketlike<void (B::*)(const basic_string<char> &)>::value, void (B::*)(const basic_string<char> &), A &, const _Placeholder<1> &>::type' (aka '_Bind<void (Centerity::Cluster::Correlation::B::*(Centerity::Cluster::Correlation::A, std::_Placeholder<1>))(const std::basic_string<char> &)>') to 'std::function<void (const std::string &)>' (aka 'function<void (const basic_string<char> &)>')

我试着把它改成 A* a = B(); 同样的结果.在任何地方都找不到类似的代码.当然创建 B b 会叫 B::f但这对我没有帮助。

我可以丢掉绑定并使用lambda,但我不知道怎么做。

解决方案:

注意:我不知道是哪个编译器。

我不知道你用的是哪种编译器,但是… 不应该是无效的。我已经在下面的代码中修正了它。

#include <memory>
#include <iostream>
#include <functional>

class A {
public:
    virtual void f(const std::string &s)
    {
        std::cout << "A " << s << std::endl;
    }
};

class B: public A {
public:
    void f(const std::string &s) override 
    {
        std::cout << "B " << s << std::endl;
    }
};

int main() 
{
    std::unique_ptr<A> a = std::make_unique<B>();
    auto callback = std::bind(&A::f, a.get(), std::placeholders::_1);

    callback("my string");
    return 0;
}

Outputs:

B my string

捕捉到的是把指向基类的指针(指向派生类的对象)传给了 std::bind(&A::f, a.get(), std::placeholders::_1);.

如果你通过值传递,那么一个新的基类A对象将被创建(通过复制构造函数),基类的f版本将被调用,就像你在程序中观察到的那样。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Pywinauto等了很久才开始行动

2022-5-13 9:00:08

解决方案

检查字符串中的一个词是否与数组中的一个词匹配,如果匹配,则从字符串中删除该词。

2022-5-13 9:00:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索