template <class Rhs, class Ret=dont_care>
struct has_complement : public true_type-or-false_type {};
Наследники:Если (i)rhsтипаRhsможно использовать в выражении~rhsи (ii)Ret=dont_careили результат выражения~rhsконвертируется вRet, затем наследуется отtrue_type, в противном случае наследуется отfalse_type.
По умолчанию поведениеRet=dont_care, чтобы не проверить на обратное значение префиксаоператора~. ЕслиRetотличается от стандартноготипа dont_care, значение возврата проверяется на конвертируемость вRet. Преобразуемый вRetозначает, что возвращаемое значение оператора может использоваться в качестве аргумента для функции, ожидающейRet:
void f(Ret);
Rhs rhs;
f(~rhs);
ЕслиRet=void, то тип возврата проверяется на то, чтобы быть точноvoid.
Заголовок:#включаетType_traitsимеет_комплемент.hpp>#включает<#включаетType_traitsимеет_оператор>Type_traitsType_traits.hpp>]
Совместимость компилятора:Требуется работа SFINAE (т.е. BOOST_NO_SFINAE не установлен). Этого не поддерживает лишь меньшинство довольно старых компиляторов.
Примеры:
имеет_комплемент<Rhs,Ret>::значение_typeявляется типомbool.
имеет_комплемент<Rhs,Ret>::значениепредставляет собойболтинтегральное постоянное выражение.
имеет_комплемент<int>::значениепредставляет собойинтегральное постоянное выражение, которое оценивает доистинное.
имеет_комплемент<int,int>наследует отtrue_type.
имеет_комплемент<constint>наследует отtrue_type.
имеет_комплемент<двойной,двойной>наследует отложный_тип.
имеет_комплемент<двойной,int>наследует отложный_тип.
имеет_комплемент<int,std::строка>наследует отложный_тип.
См. также:Типы операторов
Известные проблемы: