Boost 1.54 добавил новую библиотеку, Boost.TTI за тип черты самоанализ. Следующий код с использованием has_template
функциональность, работает на g ++, но не на Clang
#include <boost/tti/has_template.hpp>
BOOST_TTI_HAS_TEMPLATE(Template1)
BOOST_TTI_HAS_TEMPLATE(Template2)
BOOST_TTI_HAS_TEMPLATE(Template3)
struct Top
{
template <class X> struct Template1 { };
template <typename A,typename B,typename C> class Template2 { };
template <typename A,typename B,typename C,int D> class Template3 { };
};
int main()
{
static_assert( has_template_Template1<Top>::value, ""); // true
static_assert( has_template_Template2<Top>::value, ""); // true
static_assert(!has_template_Template3<Top>::value, ""); // false, not all typename/class template parameters
}
Вопрос: почему этот код не компилируется на Clang? Согласно документам Boost.TTI, поддержка макрокоманд Variadic необходима, но Clang поддерживает это с 2.9.
BOOST_TTI_HAS_TEMPLATE
использует переменные макросы из Boost.Preprocessor. Сопровождающий эту библиотеку не хочет зависеть от Boost.Config и также считает, что макрос, который определяет Config, недостаточно «силен» для библиотеки метапрограммирования препроцессора.. По этим причинам использование вариационных версий BOOST_TTI_HAS_TEMPLATE
зависит от того, BOOST_PP_VARIADICS
определено. К сожалению, код для автоматического определения того, имеет ли компилятор поддержку макроса с переменными числами, устарел и не включает clang среди компиляторов, для которых включена поддержка с переменными числами. Рекомендуемый обходной путь является определяющим BOOST_PP_VARIADICS=1
,
По-видимому, это было решено в транке, и, возможно, может быть включено в будущий выпуск.