2014-10-07 56 views
1

我有一個模板,自動亞型宏與繼承的構造,看起來像這樣:這樣一個宏C++宏插入類型名稱,如果必要

#define INST_TMPL(NAME,TMPL,...) \ 
struct NAME : public TMPL<__VA_ARGS__> { \ 
    typedef TMPL<__VA_ARGS__> Base;\ 
    using Base::Base;\ // Inherit constructors 
}; 

請沒有參數是否需要良好的作風。這對我們的項目非常有幫助;我們用它來縮短非常長的模板的類型名稱。例如,我們可以使用INST_TMPL(MyType,LongName,int,float,x::y::LongInnerType)縮短模板名稱LongName<int,float,x::y::LongInnerType>。現在我們可以簡單地使用MyType而不是長模板,並且類型也將顯示在錯誤消息中(而不是展開的模板名稱)。

但是現在有一個問題:根據使用的模板,我們有時需要在宏內的typedef中有一個typename。例如,如果使用的模板是模板參數T的內部模板,例如, T::LongName<...>,那麼我們就需要typename中的typedef,即:

typedef typename TMPL<__VA_ARGS__> Base;\ 

當然,我可以創建兩個宏,一個與typename,一個沒有。但是,這非常麻煩。相反,我想要一個總是能夠正確編譯這兩種情況的宏。這可能嗎?

+0

爲什麼不能:'template