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