types: add a 'has_native' trait

Returns true if 'ValueT::native ()' is available.
This commit is contained in:
Danny Robson 2019-02-27 11:14:45 +11:00
parent 6dadff769e
commit f381c24f29

View File

@ -3,11 +3,10 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 2011-2014 Danny Robson <danny@nerdcruft.net>
* Copyright 2011-2019 Danny Robson <danny@nerdcruft.net>
*/
#ifndef CRUFT_UTIL_TYPES_HPP
#define CRUFT_UTIL_TYPES_HPP
#pragma once
#include <cstdint>
#include <cstdlib>
@ -96,6 +95,32 @@ namespace cruft {
return sizeof... (t);
}
}
#endif
///////////////////////////////////////////////////////////////////////////
/// A trait that tests for the presence of a 'native' member function.
///
/// Not terrifically useful by itself, but it is use reasonably frequently
/// in various library wrappers that we maintain (to return the underlying
/// native objects).
template <typename ValueT, typename = std::void_t<>>
struct has_native : public std::false_type
{};
//-------------------------------------------------------------------------
template <
typename ValueT
> struct has_native<
ValueT,
std::void_t<
decltype(std::declval<ValueT> ().native ())
>
> : public std::true_type {};
//-------------------------------------------------------------------------
template <typename ValueT>
constexpr auto has_native_v = has_native<ValueT>::value;
}