我正在使用一种简单的(不是特别新的)技术来检查特定名称和类型的类成员是否存在。以下代码在 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