给出({3}}
的(减少的)实现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;
}
如果类foo
包含成员函数bar
,则struct foo {
int const& bar(int&&) { return 0; }
};
template<class T, typename... Arguments>
using bar_t = std::conditional_t<
true,
decltype(std::declval<T>().bar(std::declval<Arguments>()...)),
std::integral_constant<
decltype(std::declval<T>().bar(std::declval<Arguments>()...)) (T::*)(Arguments...),
&T::bar
>
>;
int main()
{
static_assert(type_traits::is_detected_v<bar_t, foo, int&&>, "not detected");
return 0;
}
但是,正如您所看到的,我们需要编写&#34;复杂的代码&#34;对于我们想要检测的每种方法。
我们可以将
bar_t
的想法封装到更通用的测试中吗?我想提供操作foo::bar
和所需的参数类型,并执行类似static_assert(type_traits::is_detected_v<bar_t, foo, int&&>, "not detected");
的测试。
[我已经创建了此示例的we can check。]