2016-04-08 127 views
2

我有兩個類。第一類做一些事情,然後調用第二類方法。第一類的每種方法都是這樣做的。是否有可能使用某些宏自動化代碼實現?C++將函數名稱傳遞給宏並調用它

例子:

class A 
{ 
    void Do1() 
    { 
    Do task x 
    ClassB b; 
    b.Do1(); 
    Do task y 
    } 
    void Do2() 
    { 
    Do task x 
    ClassB b; 
    b.Do2(); 
    Do task y 
    } 
} 

是否有可能實現這種方式?這不起作用,但類似的東西。

#define VOID_FUNC(name) \ 
    Do task x;\ 
    ClassB b;\ 
    b.##name##();\ 
    Do task y; 

class A 
{ 
    void Do1() 
    { 
    VOID_FUNC(__FUNCTION__); 
    } 
    void Do2() 
    { 
    VOID_FUNC(__FUNCTION__); 
    } 
} 
+0

可能,但可愛的方法是使用模板,'的std :: bind',和'std :: function'。我肯定會讚揚一個答案,勾勒出這一點。 – Bathsheba

+0

似乎沒有一種簡單的方法來創建你所要求的內容,而不那麼簡單的方法真正快速變得醜陋;如果你解釋爲什麼要這樣做,這可能會有所幫助,因爲可能有更好的方法來實現你的目的?看起來好像你想圍繞一個現有的類來編寫一個包裝,該類處理類使用的某種資源,其中任務x將獲取資源,任務y將釋放它。我想到的一個想法是,C++標準庫通常允許實際上可以適應的自定義分配器,即使對於日誌記錄等事情也是如此。 –

回答

2

有很多很好的理由避免宏,因爲他們不尊重命名空間。

另一種解決方案是,當要重新使用task xtask y使用lambda函數(C++ 11以後):

class A 
{ 
    template <typename Fun> 
    void wrapClassB(Fun&& fun) 
    { 
    Do task x 
    ClassB b; 
    fun(b); 
    Do task y 
    } 

    void Do1() 
    { 
    wrapClassB([] (ClassB& b) { 
    b.Do1(); 
    }); 
    } 
    void Do2() 
    { 
    wrapClassB([] (ClassB& b) { 
    b.Do2(); 
    }); 
    } 
}; 

對於預C++ 11可以創建functors代替lambdas和用const Fun&代替Fun&&

或者,如果你真的想用宏,你可以只與宏定義功能全:

#define VOID_FUNC(name) \ 
    void name() {\ 
    Do task x;\ 
    ClassB b;\ 
    b.name();\ 
    Do task y;\ 
    } 
class A 
{ 
    VOID_FUNC(Do1) 
    VOID_FUNC(Do2) 
}; 
+2

C++ 11添加了lambda的,但這只是一個非常方便的構造函子的方法。你可以在1998年手卷他們。 – MSalters

+0

當然你可以@MSalters,好點!我已經稍微更新了答案 – Hilborn

相關問題