我有一個模板,自動亞型宏與繼承的構造,看起來像這樣:這樣一個宏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
,一個沒有。但是,這非常麻煩。相反,我想要一個總是能夠正確編譯這兩種情況的宏。這可能嗎?
爲什麼不能:'template class Tmpl,typename ... Args> struct Wrap:Tmpl {using base = Tmpl ;使用base :: base; }; [例子](http://ideone.com/nimVZ8) –
2014-10-07 10:26:49
你現在在哪裏編寫'T :: LongName',爲什麼你不能簡單地傳遞'typename T :: LongName'作爲你的宏參數? – hvd 2014-10-07 10:29:04
@KerrekSB:現在嘗試插入'Tmpl = a :: B',你的''使用'將會像下面這樣結束:'使用:: B <...> :: a :: B <...>',它不能編譯。 – gexicide 2014-10-07 10:29:11