Как я могу скомпилировать шаблоны с переменным условием? - PullRequest
7 голосов
/ 01 июня 2010

Есть ли макрос, который сообщает мне, поддерживает ли мой компилятор шаблоны с переменными числами?

#ifdef VARIADIC_TEMPLATES_AVAILABLE

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

#else

???

#endif

Если они не поддерживаются, думаю, я бы смоделировал их с кучей перегрузок. Есть идеи получше? Может быть, есть библиотеки препроцессоров, которые могут облегчить работу?

Ответы [ 2 ]

8 голосов
/ 01 июня 2010

Может быть: #ifndef BOOST_NO_VARIADIC_TEMPLATES?


Если шаблоны переменных не поддерживаются, вы можете подумать об использовании библиотеки буст-кортежей:

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

И

coolstuff(boost::make_tuple(1, 2, 3));
7 голосов
/ 01 июня 2010

Похоже, что текущая версия Boost определяет BOOST_NO_VARIADIC_TEMPLATES, если вариационные шаблоны недоступны. Это обеспечивается boost/config.hpp; см. здесь для документации config.hpp.

Если шаблоны с переменными значениями недоступны, вам, вероятно, придется смоделировать их с помощью множества перегрузок, как вы сказали. Здесь может помочь библиотека Boost.Preprocessor ; он предназначен для автоматизации всех видов повторяющегося исходного кода, включая перегрузки шаблонов. Вы можете найти BOOST_NO_VARIADIC_TEMPLATES в исходных деревьях Boost, чтобы найти примеры его использования для имитации шаблонов с переменными параметрами.

...