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::строка>
наследует отложный_тип
.
См. также:Типы операторов
Известные проблемы: