код проверки существования метода ломается в vs2015

Следующий код проверяет, существует ли метод foo () в классе A. Этот код компилируется в 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");

0

Решение

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");
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]