特定の名前と型のクラス メンバーの存在を確認するために、単純な (特に新しいものではない) 手法を使用しています。次のコードは 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