Я использую простой (не особенно новый) метод для проверки существования члена класса с определенным именем и типом.
Следующий код нормально компилируется в Clang, но MSVC сообщает, что static_assert не удалось выполнить. .
template
struct SfinaeNonType
{
typedef void Type;
};
struct Member
{
};
template
struct HasMember
{
static const bool RESULT = false;
};
template
struct HasMember
{
static const bool RESULT = true;
};
struct A
{
Member member;
};
static_assert(HasMember::RESULT, ""); // msvc rejects
Есть ли в этом коде что-то несоответствующее требованиям или это просто ошибка в MSVC?
Если это ошибка, есть ли простой обходной путь?
Любопытно, что MSVC устраивает (в остальном идентичный код) проверку существования функции-члена, а не члена данных:
template
struct SfinaeNonType
{
typedef void Type;
};
struct Member
{
};
template
struct HasMember
{
static const bool RESULT = false;
};
template
struct HasMember
{
static const bool RESULT = true;
};
struct A
{
Member member();
};
static_assert(HasMember::RESULT, ""); // msvc accepts
Подробнее здесь: https://stackoverflow.com/questions/189 ... -compliant