是否有一个宏告诉我我的编译器是否支持可变参数模板?
#ifdef VARIADIC_TEMPLATES_AVAILABLE
template<typename... Args> void coolstuff(Args&&... args);
#else
???
#endif
如果它们不受支持,我想我会用一堆重载来模拟它们。有更好的想法吗?也许有预处理器库可以简化工作?
答案 0 :(得分:8)
也许:#ifndef BOOST_NO_VARIADIC_TEMPLATES
?
如果不支持可变参数模板,您可能会考虑使用boost元组库:
template<typename Tuple> void coolstuff(Tuple&& args);
和
coolstuff(boost::make_tuple(1, 2, 3));
答案 1 :(得分:7)
如果可变参数模板不可用,Boost的当前版本似乎定义了BOOST_NO_VARIADIC_TEMPLATES。这由boost/config.hpp
提供;有关config.hpp文档,请参阅here。
如果可变参数模板不可用,那么你可能不得不用一堆重载来模拟它们,正如你所说的那样。 Boost.Preprocessor图书馆可以在这里提供帮助;它旨在自动化各种重复的源代码,包括模板重载。您可以在Boost源树中搜索BOOST_NO_VARIADIC_TEMPLATES,以获取使用它来模拟可变参数模板的示例。