2016-08-09 76 views
3

定義我在CPP像如何創建一個類的成員函數funtion對象,在宏觀

#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 ::功能<(?)(?)>

我已編輯的評論的一個建議

+2

您需要顯示如何使用此宏的[mcve],因爲使用標記粘貼操作符「##」粘貼「class」和「name」沒有任何意義。 –

+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包裝本身中擁有類實例構造函數的方法。如果已經聲明瞭類實例,則應相應地修改示例函子。

+0

謝謝山姆,它有助於理解。 –

相關問題