首页 文章

来自派生类的C std :: function绑定

提问于
浏览
3

如果我有一个基类MessageWrapper,带有子类SetConfigurationData,为什么绑定子类参数不起作用?

不应该多态地工作吗?

Class MessageHandler
{
    public:
    void RegisterHandler(std::function<void(MessageWrapper &)> callback_)
    {}
};

class Testing
{
    public:

    Testing(MessageHandler &handler_)
        : m_Handler(handler_)
    {
        m_Handler.RegisterHandler(std::bind(&Testing::TestMessageHandler, this, std::placeholders::_1));
    }

    void TestMessageHandler(SetConfigurationData &msg_)
    {}

    MessageHandler m_Handler;
};

我收到错误:“无法专门化函数模板'unkown-type std :: invoke(Callable &&,Types && ..)'

如果我这样做,它的工作原理:

void TestMessageHandler(MessageWrapper &msg_)
{}

1 回答

  • 2

    多态性不能像这样工作 . 我将用一个例子来解释 . 让我们说这个功能 .

    void TestMessageHandler(SetConfigurationData &msg_)
    

    在它的身体中具有特定于子对象的东西 . 说

    msg.child_method()
    

    现在,由于RegisterHandler的callback_()将基类作为参数,因此它应该对这个“msg.child_method()”调用做什么,因为它不是基类方法?

    现在,如果我们反过来这样做会发生什么 . 以下作品 .

    class MessageWrapper
    {
    };
    
    class SetConfigurationData : public MessageWrapper
    {
        public:
        void RegisterHandler(std::function<void(SetConfigurationData&)> callback_)
        {}
    };
    
    class MessageHandler
    {
    };
    
    class Testing
    {
        public:
    
            Testing(SetConfigurationData &handler_)
                : m_Handler(handler_)
            {
                m_Handler.RegisterHandler(std::bind(&Testing::TestMessageHandler, this, std::placeholders::_1));
            }
    
            void TestMessageHandler(MessageWrapper &msg_)
            {}
    
            SetConfigurationData m_Handler;
    };
    

    尽管TestMessageHandler将MessageWrapper作为参数,但是您可以将它绑定到callback_,它将Child类(SetConfigurationData)作为参数 .

相关问题