如何确定某个类型是否具有任何返回类型的成员函数?

Tob*_*ias 12 c++ templates type-traits c++11

我需要找出一个给定类型是否具有函数X作为具有给定参数列表的可调用函数.请在支票上关心的返回值.然而.

我从另一个Stack Overflow问题中找到了这个解决方案似乎运行良好.它的作用是:

#include <type_traits>

template <typename C, typename F, typename = void>
struct is_call_possible : public std::false_type {};

template <typename C, typename R, typename... A>
struct is_call_possible<C, R(A...),
    typename std::enable_if<
        std::is_same<R, void>::value ||
        std::is_convertible<decltype(
            std::declval<C>().operator()(std::declval<A>()...)
        ), R>::value
    >::type
> : public std::true_type {};
Run Code Online (Sandbox Code Playgroud)

这正是我想要的,除了在检查中你还提供了所需的返回类型.我试图找到一种方法来修改它,以便能够检查而不考虑返回类型,但我想不出办法.

有谁知道如何做到这一点?

jro*_*rok 11

只做表达SFINAE并丢弃结果:

template <typename C, typename... Args>
struct is_call_possible {
private:
    template<typename T>
    static auto check(int)
        -> decltype( std::declval<T>().operator()(std::declval<Args>()...),
                     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     // overload is removed if this expression is ill-formed
           std::true_type() );

    template<typename>
    static std::false_type check(...);
public:
    static constexpr bool value = decltype(check<C>(0))::value;
};
Run Code Online (Sandbox Code Playgroud)

实例.