Я делаю наивное колесо типа черт is_base_of
.А вот минимальная демонстрация о моей реализации (без учета надежности, is_class ...).
#include <type_traits>
#include <cstdint>
struct A
{
};
struct B : A
{
};
template
<typename T, typename U>
struct IsBaseOf {
constexpr static bool Test(T* t)
{
return true;
}
constexpr static bool Test(...)
{
return false;
}
constexpr static bool value = IsBaseOf<T,U>::Test(static_cast<U*>(nullptr));
};
int main()
{
static_assert(IsBaseOf<A, B>::value, "Pass");
}
Эта демонстрация может быть скомпилирована gcc / clang, но не может быть скомпилирована MSVC.http://rextester.com/ATOC6638 http://rextester.com/IWU81465
Когда я набираю его на моем ноутбуке Visual Studio 2015 (с обновлением 3).Он также не может быть скомпилирован, IDE напоминает мне, что «выражение должно иметь постоянное значение» перед компиляцией.
Поэтому мне интересно, как MSVC поддерживает constexpr или мой код неверен?