Boost C++ Libraries of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.


template <class Rhs, class Ret=dont_care>
struct has_complement : public true_type-or-false_type {};

Inherits: If (i) rhs of type Rhs can be used in expression ~rhs, and (ii) Ret=dont_care or the result of expression ~rhs is convertible to Ret then inherits from true_type, otherwise inherits from false_type.

The default behaviour (Ret=dont_care) is to not check for the return value of prefix operator~. If Ret is different from the default dont_care type, the return value is checked to be convertible to Ret. Convertible to Ret means that the return value of the operator can be used as argument to a function expecting Ret:

void f(Ret);
Rhs rhs;
f(~rhs); // is valid if has_complement<Rhs, Ret>::value==true

If Ret=void, the return type is checked to be exactly void.

Header: #include <boost/type_traits/has_complement.hpp> or #include <boost/type_traits/has_operator.hpp> or #include <boost/type_traits.hpp>

Compiler Compatibility: Requires working SFINAE (i.e. BOOST_NO_SFINAE is not set). Only a minority of rather old compilers do not support this.


has_complement<Rhs, Ret>::value_type is the type bool.

has_complement<Rhs, Ret>::value is a bool integral constant expression.

has_complement<int>::value is a bool integral constant expression that evaluates to true.

has_complement<long> inherits from true_type.

has_complement<int, int> inherits from true_type.

has_complement<int, long> inherits from true_type.

has_complement<const int> inherits from true_type.

has_complement<int*> inherits from false_type.

has_complement<double, double> inherits from false_type.

has_complement<double, int> inherits from false_type.

has_complement<int, std::string> inherits from false_type.

See also: Operator Type Traits

Known issues:

Known issues:

For modern compilers (those that support arbitrary SFINAE-expressions and decltype/declval) this trait offers near perfect detection. In this situation the macro BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION will be defined after including <boost/type_traits/has_complement.hpp>. Please note however, that detection is based on function signature only, in the case that the operator is a function template then has_complement cannot perform introspection of the template function body to ensure that the type meets all of the conceptual requirements of the actual code.

For older compilers (BOOST_TT_HAS_ACCURATE_BINARY_OPERATOR_DETECTION not defined) then there are a number of issues: