如何为宏中定义的类成员函数创建函数对象

How to create a funtion object for a class member function which defined in macro

本文关键字:函数 成员 创建 对象 定义      更新时间:2023-10-16

我在我的CPP中有一些东西,比如

#define DECLARE_some(name, argType, returnType) 
        class myclass##name : public Service::ServiceRpcHandler<a, r> { 
        public: 
            myclass##name(Service *); 
            CONST_STRING getName() const override;
            void operator()(Service::ServiceRpcHandler<a, r>::type *); 
        };#decleration

 #define IMPLEMENT_Some(name, argType, returnType) 
            class myclass##name::myclass##name(Service * owner) : Service::ServiceRpcHandler<a, r>(o) { } 
            CONST_STRING myclass##name::getName() const { return #name; }
            void myclass##name::operator()(Service::ServiceRpcHandler<a, r>::type * twk)#implementation of a declared macro

我只想为void myclass##name::operator()(Service::ServiceRpcHandler<a, r>::type * twk)创建一个函数对象。我已经明白myclass##name::operator()本身是一个函子,但无论如何,我想让另一个类似' std::function<(?)(?)>

我按照其中一条评论的建议编辑了

创建函数对象没有什么特别神秘的。为了创建调用构造类的()操作符的函数对象,您需要做的第一件事是,类的实例。你不能凭空调用operator()。您需要一个对象,其()操作符将转发给您的函数对象。

myclass##name(Service *);

宏创建了一个类,其构造函数接受一个Service *形参。因此,假设使用宏来构造类myclassdisplay,一种方法是:

auto f=[](Service *p, Service::ServiceRpcHandler<a, r>::type *arg)
{
    myclassdisplay c(p);
    c(arg);
};

函数构造一个新的myclassdisplay实例,并调用其()操作符。

你可以创建一个宏:

#define FUNCTOR(name) [](Service *p, Service::ServiceRpcHandler<a, r>::type *arg)
{
    myclass##name c(p);

    c(arg);
};

然后用同样的方式使用:

auto f=FUNCTOR(display);

你的问题不清楚类的实例来自哪里。这将是在函函数包装器本身中拥有类实例构造函数的方法。如果已经声明了类实例,则应该相应地修改样例函函数。