static_assert( __cplusplus > 2020'99 ); #pragma once #include namespace Alepha::Hydrogen::Algorithm ::detail:: identity_m { inline namespace exports { /*! * Specializable identity function. * * Sometimes you need an unambiguous overload for `std::identity`. Because the * standard's version is a function object with an unbounded member template * `operator ()`, this means that deduction contexts cannod deduce which * type is the range and domain for the identity object passed. Normally * this doesn't matter, but some `Alepha` constructs need to inspect functions. * to that end, one can use `Alepha::Algorithm::identity< T >` for this purpose * * @note This functions effectively the same as the original SGI STL's `identity` * extension, but with C++11's rvalue semantics. Although we also use a template * variable to avoid the need to instantiate. */ template< typename T > constexpr auto identity= []( T val ) { return val; }; } } namespace Alepha::Hydrogen::Algorithm::inline exports::inline identity_m { using namespace detail::identity_m::exports; }