How to call the function in derived class to process handle_post?(Function call missing argument list to create pointer)

How to call the function in derived class to process handle_post?(Function call missing argument list to create pointer)

在我的基础class中,这是一个public非静态成员函数:

void BaseClass::SetPorcessMethod()
{
     //do something
    Listener.support(methods::POST, this->HandlePost);
    //do something
}

在上面的函数中,Listener是一个静态成员变量。 函数 HandlePost 是一个纯虚函数,由所有派生的 classes 实现。我想使用 this 指针从不同的派生 class 调用不同的 HandlePost。 喜欢:

class BaseClass
{
 public:
   static http_listener listener;
   void SetPorcessMethod();
   virtual void HandlePost((http_request request) = 0;
   /*listener is init in constructor , not display here*/
}
 class Derived2:public BaseClass
{
  void HandlePost(http_request request);
}
class Derived1:public BaseClass
{
  void HandlePost(http_request request);
}

Derived1 instance1;
instance1.SetPorcessMethod();
Derived2 instance2;
instance2.SetPorcessMethod();

但是显示BaseClass::HandlePost:function call missing argument list use &BaseClass::HandlePost:function to create a pointer to member。我知道这是因为Your code attempts to pass a pointer-to-member-function, which cannot be converted to a pointer-to-function. This is because a pointer-to-member-function can only be called on an object, so it wouldn't know what object to use. Function call missing argument list to create pointer 但是我应该怎么做才能用 support() 从派生的 class 调用函数?

您正在尝试将成员函数传递给 support。为了调用这样的函数,调用者需要成员函数参数和指向调用函数的实例的指针。

然而 support 需要一个 std::function<void(http_request)>,即没有实例指针。因此,您必须将调用包装到另一个不需要传递 BaseClass 实例指针的可调用对象中。您可以使用 lambda(如果您愿意,也可以使用 std::bind):

Listener.support( methods::POST,
    [this](http_request request){return HandlePost(request);} );

Listener.support( methods::POST,
    std::bind(&BaseClass::HandlePost, this, std::placeholders::_1) );

#include<functional> 用于后一种变体。