class 声明中的“is_base_of”

“is_base_of” inside a class declaration

我在 class 声明中调用 std::is_base_of 时遇到问题,因为类型不完整。我遇到了这个 Whosebug 问题:Why can't "is_base_of" be used inside a class declaration (incomplete type)?

然后我尝试实现自己的元函数来检查给定模板 class 是否是另一个模板的基础。

我已经在 MSVC 19.28.29337cl.exe 报告的版本)和 clang-7 online compiler 上用 C++17 测试了我的代码,看起来它运行良好完整和不完整 classes。这是我的代码:

namespace helper {
    template<class Base>
    static std::true_type isBaseOf(Base *b);

    template<class Base>
    static std::false_type isBaseOf(...);

    template<class Base>
    static std::false_type isBaseOf(void*);
}

template<class B, class D>
using IsBaseOf = decltype(helper::isBaseOf<B>(std::declval<D*>()));

template<class B, class D>
static inline constexpr bool IsBaseOf_v = IsBaseOf<B, D>::value;

现在我想知道,我的代码有什么问题?不是便携的吗?不符合标准吗?我做了什么不能接受的事吗?

此外,如果我的代码一切正常,那么为什么标准不使用如此简单的实现?

已编辑

添加了对 void 类型的处理 - 感谢 Scheff

似乎唯一的区别是它不处理非public继承。
感谢 Axalo 的评论