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