2016-08-09 19 views
3

definierte Ich habe etwas in meinem CPP wieWie ein funtion Objekt für eine Elementfunktion der Klasse erstellen, die in Makro

#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 

Alles, was ich will nur ein Funktionsobjekt für void myclass##name::operator()(Service::ServiceRpcHandler<a, r>::type * twk) zu erstellen. Ich habe verstanden, dass myclass##name::operator() selbst ein Funktor aber trotzdem möchte ich ein ein anderes, etwas machen wie `std :: function < (?) (?)>

Ich habe als einer der Kommentar bearbeitet schlägt

+2

Sie müssen ein [mcve] anzeigen, wie dieses Makro verwendet wird, da es keinen Sinn macht, "class" und "name" mit dem Token-Pastenoperator '##' zu kleben. –

+0

@ Sam, danke das war ein Tippfehler ich machte eine Bearbeitung –

Antwort

2

Es gibt nichts besonders Geheimnisvolles beim Erstellen eines Funktionsobjekts. Um ein Funktionsobjekt zu erzeugen, das den Operator () der konstruierten Klasse aufruft, ist das erste, was Sie tun müssen, eine Instanz der Klasse. Sie können operator() nicht aus der Luft rufen. Sie benötigen ein Objekt, dessen Operator () Ihr Funktionsobjekt weiterleitet.

myclass##name(Service *); 

Der Makro erstellt eine Klasse, deren Konstruktor nimmt einen Service * Parameter. So vorausgesetzt, dass das Makro einer Klasse zu konstruieren, verwendet wird myclassdisplay, einen Weg, dies zu tun wäre:

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

    c(arg); 
}; 

Die Funktion erstellt eine neue Instanz der myclassdisplay und ruft seinen () Operator.

Sie könnten dies in einem Makro seiner eigenen machen:

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

Und das dann auf die gleiche Art und Weise verwenden:

auto f=FUNCTOR(display); 

Ihre Frage nicht klar ist, wo genau die Instanzen der Klasse komme aus. Dies wäre der Weg, den Klasseninstanz-Konstruktor im Funktor-Wrapper selbst zu haben. Wenn die Klasseninstanzen bereits deklariert sind, sollte der Musterfunktor entsprechend geändert werden.

+0

Danke Sam, es hilft zu verstehen. –