2016-08-09 3 views
3

J'ai quelque chose dans mon RPC commeComment créer un objet funtion pour une fonction de membre de classe qui défini dans macro

#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 

Tout ce que je veux juste est de créer un objet de fonction pour void myclass##name::operator()(Service::ServiceRpcHandler<a, r>::type * twk). J'ai compris que myclass##name::operator() lui-même est un foncteur, mais de toute façon je veux faire un (?)>

une chose comme `std :: fonction < (?) une autre que j'ai édité comme l'un des commentaires suggère

+2

Vous devez montrer un [mcve] de la façon dont cette macro est utilisée, car il ne sert à rien de coller "class" et "name" en utilisant l'opérateur de collage de jetons, '##'. –

+0

@ Sam, merci c'était une faute de frappe j'ai fait un edit –

Répondre

2

Il n'y a rien de particulièrement mystérieux à propos de la création d'un objet fonction. Pour créer un objet fonction qui appelle l'opérateur () de la classe construite, la première chose que vous devez faire est, bien, une instance de la classe. Vous ne pouvez pas invoquer operator() à partir de rien. Vous avez besoin d'un objet dont l'objet () sera transféré à votre objet de fonction.

myclass##name(Service *); 

La macro crée une classe dont le constructeur prend un paramètre Service *. Donc, en supposant que la macro est utilisée pour construire une classe myclassdisplay, une façon de le faire serait:

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

    c(arg); 
}; 

La fonction construit une nouvelle instance de la myclassdisplay, et invoque son opérateur ().

Vous pouvez faire cela en une macro de son propre:

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

Et puis utilisez ce la même façon:

auto f=FUNCTOR(display); 

Votre question ne sait pas exactement où les instances du classe viennent. Ce serait le moyen d'avoir le constructeur des instances de classe dans l'encapsuleur fonctor lui-même. Si les instances de classe sont déjà déclarées, l'exemple de foncteur doit être modifié en conséquence.

+0

Merci Sam, ça aide à comprendre. –