这个简单的有成员SFINAE技术是否合规?

时间:2013-09-21 15:38:17

标签: c++ templates visual-c++ language-lawyer sfinae

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

0 个答案:

没有答案