是否有宏告訴我我的編譯器是否支持可變參數模板?如何有條件地編譯可變模板?
#ifdef VARIADIC_TEMPLATES_AVAILABLE
template<typename... Args> void coolstuff(Args&&... args);
#else
???
#endif
如果他們不支持,我想我會用一堆重載模擬它們。任何更好的想法?也許有預處理器庫可以緩解這項工作?
是否有宏告訴我我的編譯器是否支持可變參數模板?如何有條件地編譯可變模板?
#ifdef VARIADIC_TEMPLATES_AVAILABLE
template<typename... Args> void coolstuff(Args&&... args);
#else
???
#endif
如果他們不支持,我想我會用一堆重載模擬它們。任何更好的想法?也許有預處理器庫可以緩解這項工作?
它看起來像升壓的當前版本定義BOOST_NO_VARIADIC_TEMPLATES如果可用模板不可用。這由boost/config.hpp
提供;有關config.hpp文檔,請參閱here。
如果可變參數模板不可用,那麼您可能必須使用一堆重載來模擬它們,正如您所說的。 Boost.Preprocessor圖書館可以在這裏幫助;它旨在自動化各種重複的源代碼,包括模板重載。您可以搜索BOOST_NO_VARIADIC_TEMPLATES的Boost源樹以查看使用它來模擬可變參數模板的示例。
也許:#ifndef BOOST_NO_VARIADIC_TEMPLATES
?
如果可變參數模板不支持,你可能會認爲使用升壓元組庫:
template<typename Tuple> void coolstuff(Tuple&& args);
和:
coolstuff(boost::make_tuple(1, 2, 3));
我會結合你的方法與Niels的:提出一個接口與許多重載的各種arity感謝Boost.Preprocessor將參數包裝成一個'Boost.Fusion'容器(元組,向量等),這是然後傳遞給一個模板類,期望在其中實現實際的實現。這個想法僅僅是爲了減少宏的代碼量,以便於調試:) – 2010-06-01 18:02:57