[/
Copyright 2018 Glen Joseph Fernandes
(glenjofe@gmail.com)

Distributed under the Boost Software License,
Version 1.0. (See accompanying file LICENSE_1_0.txt
or copy at http://www.boost.org/LICENSE_1_0.txt).
]

[section:enable_if enable_if_]

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

    template<bool B, class T = void>
    using enable_if_t = typename enable_if_<B, T>::type;

__type If `B` is true, then the member `type` is defined to be `T`. Otherwise
there is no member `type`.

__header `#include <boost/type_traits/enable_if.hpp>`

[note The trait has the name `enable_if_` (with a trailing underscore) but
behaves like `std::enable_if` or `boost::enable_if_c`. The existing trait
with the name `boost::enable_if` has a different interface.]

__examples

The following function can be used to destroy each element of an array and
specially handle arrays of trivially destructible types.

    template<class T>
    typename boost::enable_if_<!boost::has_trivial_destructor<T>::value>::type
    destroy(T* ptr, std::size_t size)
    {
        while (size > 0) {
            ptr[--size].~T();
        }
    }

    template<class T>
    typename boost::enable_if_<boost::has_trivial_destructor<T>::value>::type
    destroy(T*, std::size_t) { }

[all_compilers] The type alias `enable_if_t` is only available if the compiler
supports template aliases.

[endsect]
