2010-06-01 61 views
7

是否有宏告訴我我的編譯器是否支持可變參數模板?如何有條件地編譯可變模板?

#ifdef VARIADIC_TEMPLATES_AVAILABLE 

template<typename... Args> void coolstuff(Args&&... args); 

#else 

??? 

#endif 

如果他們不支持,我想我會用一堆重載模擬它們。任何更好的想法?也許有預處理器庫可以緩解這項工作?

回答

7

它看起來像升壓的當前版本定義BOOST_NO_VARIADIC_TEMPLATES如果可用模板不可用。這由boost/config.hpp提供;有關config.hpp文檔,請參閱here

如果可變參數模板不可用,那麼您可能必須使用一堆重載來模擬它們,正如您所說的。 Boost.Preprocessor圖書館可以在這裏幫助;它旨在自動化各種重複的源代碼,包括模板重載。您可以搜索BOOST_NO_VARIADIC_TEMPLATES的Boost源樹以查看使用它來模擬可變參數模板的示例。

+1

我會結合你的方法與Niels的:提出一個接口與許多重載的各種arity感謝Boost.Preprocessor將參數包裝成一個'Boost.Fusion'容器(元組,向量等),這是然後傳遞給一個模板類,期望在其中實現實際的實現。這個想法僅僅是爲了減少宏的代碼量,以便於調試:) – 2010-06-01 18:02:57

8

也許:#ifndef BOOST_NO_VARIADIC_TEMPLATES


如果可變參數模板不支持,你可能會認爲使用升壓元組庫:

template<typename Tuple> void coolstuff(Tuple&& args); 

和:

coolstuff(boost::make_tuple(1, 2, 3));