我们如何修改检测工具包以检查类是否具有具有特定签名的成员函数?

时间:2016-03-07 15:29:08

标签: c++ templates c++14 sfinae typetraits

给出({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

,则

detection idiom

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。]

0 个答案:

没有答案