Существует ли макрос, который говорит мне, поддерживает ли мой компилятор шаблоны variadic?
#ifdef VARIADIC_TEMPLATES_AVAILABLE
template<typename... Args> void coolstuff(Args&&... args);
#else
???
#endif
Если бы они не поддерживаются, я предполагаю, что моделировал бы их с набором перегрузок. Какие-либо лучшие идеи? Возможно, существуют библиотеки препроцессора, которые могут упростить задание?
Похоже, что текущая версия Boost определяет BOOST_NO_VARIADIC_TEMPLATES, если вариативные шаблоны недоступны. Это обеспечивается boost / config.hpp
; см. здесь для документации по config.hpp.
Если вариативные шаблоны недоступны, вам, вероятно, придется смоделировать их с помощью множества перегрузок, как вы сказали. Здесь может помочь библиотека Boost.Preprocessor ; он разработан для автоматизации всех видов повторяющегося исходного кода, включая перегрузки шаблонов. Вы можете выполнить поиск в деревьях источников Boost для BOOST_NO_VARIADIC_TEMPLATES, чтобы найти примеры его использования для моделирования вариативных шаблонов.
Возможно: #ifndef BOOST_NO_VARIADIC_TEMPLATES
?
Если вариативные шаблоны не поддерживаются, вы можете подумать об использовании библиотеки ускоряющих кортежей:
template<typename Tuple> void coolstuff(Tuple&& args);
И:
coolstuff(boost::make_tuple(1, 2, 3));