方法存在检查器代码在vs2015中断

sim*_*mon 0 c++ c++11 msvc12 visual-studio-2015 msvc14

以下代码检查类A中是否存在foo()方法.此代码在vs2013下编译,但静态断言在vs2015上失败.哪个编译器版本说实话?如果vs2015,那么如何修复代码?

#include <type_traits>

struct MethodTester_foo {
    template<typename U, typename MethodType>
    static auto test(U* p) -> decltype(static_cast<MethodType>(U::foo));
    template<typename U, typename MethodType> static auto test(...)->std::false_type;
};

template <typename Class, typename MethodType, class MethodTester>
using HasMethod =
typename std::conditional
<
    std::is_same<
        decltype(MethodTester::template test<Class, MethodType>(0)),
        std::false_type
    >::value,
    std::false_type, std::true_type
>::type;

struct A { int foo() { return 1; } };

static_assert(HasMethod<A, int(A::*)(), MethodTester_foo>::value, "Has no method named foo");
Run Code Online (Sandbox Code Playgroud)

Okt*_*ist 5

2015年是正确的.而不是U::foo你需要&U::foo.这&ClassName::methodName是在C++中获取指向成员函数的指针的唯一方法.


另外,您的代码可以大大简化:

#include <type_traits>

struct MethodTester_foo {
    template<typename U, typename MethodType, typename = decltype(static_cast<MethodType>(&U::foo))>
    static auto test(U* p) -> std::true_type;
    template<typename U, typename MethodType>
    static auto test(...) -> std::false_type;
};

template <typename Class, typename MethodType, class MethodTester>
using HasMethod = decltype(MethodTester::template test<Class, MethodType>(0));

struct A { int foo() { return 1; } };

static_assert(HasMethod<A, int(A::*)(), MethodTester_foo>::value, "Has no method named foo");
Run Code Online (Sandbox Code Playgroud)