1

特定の名前と型のクラス メンバーの存在を確認するために、単純な (特に新しいものではない) 手法を使用しています。次のコードは Clang で正常にコンパイルされますが、MSVC は static_assert が失敗したと報告します。

template<typename T, T m>
struct SfinaeNonType
{
    typedef void Type;
};

struct Member
{
};

template<typename C, typename U = void>
struct HasMember
{
    static const bool RESULT = false;
};

template<typename C>
struct HasMember<C, typename SfinaeNonType<Member C::*, &C::member>::Type>
{
    static const bool RESULT = true;
};

struct A
{
    Member member;
};

static_assert(HasMember<A>::RESULT, ""); // msvc rejects

このコードに準拠していないものはありますか、それとも単に MSVC のバグですか?

バグの場合、簡単な回避策はありますか?

不思議なことに、MSVC はデータ メンバーではなくメンバー関数の存在を (それ以外は同一のコードで) チェックすることに満足しています。

template<typename T, T m>
struct SfinaeNonType
{
    typedef void Type;
};

struct Member
{
};

template<typename C, typename U = void>
struct HasMember
{
    static const bool RESULT = false;
};

template<typename C>
struct HasMember<C, typename SfinaeNonType<Member (C::*)(), &C::member>::Type>
{
    static const bool RESULT = true;
};

struct A
{
    Member member();
};

static_assert(HasMember<A>::RESULT, ""); // msvc accepts
4

0 に答える 0