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

时间:2016-08-09 10:12:50

标签: c++ functor

我的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&lt;(?)(?)&gt;

我已经编辑了其中一条评论建议

1 个答案:

答案 0 :(得分:2)

创建一个函数对象没什么特别神秘的。为了创建一个调用构造的类()运算符的函数对象,你需要做的第一件事就是类的一个实例。你无法凭空调用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);

您的问题并不清楚该类实例的来源。这将是在functor包装器中拥有类实例构造函数的方法。如果已经声明了类实例,则应相应地修改示例仿函数。