2016-01-18 3 views
1

Кто-нибудь знает, как работает следующий код для аргумента шаблона для enable_if?Синтаксис шаблона шаблона как выражение

template <int n> void f(typename std::enable_if<(n < 0)>::type* = 0) { 
/* ... n is negative ... */ 
} 
template <int n> void f(typename std::enable_if<(n >= 0)>::type* = 0) { 
/* ... n is positive ... */ 
} 

Конкретно эта часть (n < 0)>::type*, которая не имеет смысла для меня, потому что это выглядит как компилятор неявно преобразовывать выражение (n < 0) в объект.

Я также видел этот стиль обработки выражения как объекта в нескольких других примерах SFINAE, но то, что здесь происходит, ускользает от меня. Является ли объект определенным в некотором заголовке C++ или это уже в стандарте? Если да, то каков этот метод обработки выражения как вызываемого объекта и как я могу больше узнать об этом?

Большое спасибо.

ответ

2

это выглядит как компилятор неявно преобразовать выражение (п < 0) в объект

Номер n < 0 является аргумент шаблона (с типом bool) из std::enable_if и std::enable_if<(n < 0)>::type является членом typedef определяется внутри std::enable_if (только если n < 0 - это правда).

template< bool B, class T = void > 
struct enable_if; 

Если B является true, std::enable_if имеет тип ЬурейеЕ общественный член, равный к T; в противном случае нет члена typedef.

Это metafunction удобный способ использовать SFINAE для условно удалить функции от разрешения перегрузки в зависимости от типа черты и обеспечить отдельные перегруженные функции и специализации для различных признаков типа. std::enable_if может использоваться как дополнительный аргумент функции (не относится к перегрузкам оператора), как возвращаемый тип (не относится к конструкторам и деструкторам) или как параметр шаблона шаблона или функции класса .

Смежные вопросы