我的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;
我已经编辑了其中一条评论建议
答案 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包装器中拥有类实例构造函数的方法。如果已经声明了类实例,则应相应地修改示例仿函数。