2017-02-03 9 views
0

次のコードは、クラスAにfoo()メソッドが存在するかどうかを調べます。このコードはvs2013ではコンパイルされていますが、vs2015では静的アサーションが失敗します。どのコンパイラのバージョンが真実を伝えていますか? 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"); 

答えて

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"); 
:さておき、あなたのコードを実質的に簡素化することができるよう


関連する問題