给定(减少)检测习语的实现
namespace type_traits
{
template<typename... Ts>
using void_t = void;
namespace detail
{
template<typename, template<typename...> class, typename...>
struct is_detected : std::false_type {};
template<template<class...> class Operation, typename... Arguments>
struct is_detected<void_t<Operation<Arguments...>>, Operation, Arguments...> : std::true_type {};
}
template<template<class...> class Operation, typename... Arguments>
using is_detected = detail::is_detected<void_t<>, Operation, Arguments...>;
template<template<class...> class Operation, typename... Arguments>
constexpr bool is_detected_v = detail::is_detected<void_t<>, Operation, Arguments...>::value;
}
Run Code Online (Sandbox Code Playgroud)
我们可以轻松检查一个类是否foo包含成员函数bar
struct foo {
int const& bar(int&&) { return 0; }
};
template<class T>
using bar_t = …Run Code Online (Sandbox Code Playgroud)