2013-04-11 22 views
0

我有一堆用戶定義的結構;讓我們稱他們爲A,B和C.預處理器魔法在模板中完成typename

我不能修改它們,我需要添加記錄功能;所以我已經添加了我自己的這些結構的日誌版本來幫助解決這個問題。我們稱之爲A_Log,B_Log和C_Log。

我創建一個名爲LogState(const T *ptr)其中T意一個成員函數的模板StateLogger類是A,B或C.

template <typename T> 
class StateLogger { 
    public: 
    void LogState(const T *ptr); 

    private: 
    std::vector<T> requests; 
}; 

在這個函數中,我打算構建A_Log/B_Log/C_Log結構。

template<typename T> 
void StateLogger<T>::LogState(const T *ptr) { 
    ... 
    VOODOO myLog = VOODOO(ptr); 

} 

我想知道如果我可以使用一些魔法預處理追加_LogTVOODOO。 因此,如果我使用StateLogger<A>::LogState(a_ptr) 我希望編譯器生成A_Log而不是Voodoo

我意識到我可以使用模板專門化來解決這個問題,但我對此很好奇。

+0

沒有預處理器爲此,請! – 2013-04-11 17:26:25

+0

您不能在此處使用預處理器,因爲只有在預處理器已經運行後纔會實例化模板。即您不能使用用於在預處理器中實例化模板的類型名稱。 – dyp 2013-04-11 17:28:11

回答

6
template <class T> struct logger_type; 
template <> struct logger_type<A> { 
    typedef A_Log type; 
}; 

就這樣,只要你需要記錄器,只需使用typename logger_type<T>::type

+0

如果你願意的話,你可以在這之上使用預處理器魔術:foreach類型T,專門針對T的logger_type。 – EHuhtala 2013-04-11 17:48:39

+0

更好的是,我將'A_Log'作爲'Log '右鍵實現。 – Yakk 2013-04-11 19:09:48

+0

謝謝!我希望有一種方法不必輸入每個結構。 – Raja 2013-04-11 22:06:27

相關問題