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.29337
(cl.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 的评论
我在 class 声明中调用 std::is_base_of
时遇到问题,因为类型不完整。我遇到了这个 Whosebug 问题:Why can't "is_base_of" be used inside a class declaration (incomplete type)?
然后我尝试实现自己的元函数来检查给定模板 class 是否是另一个模板的基础。
我已经在 MSVC 19.28.29337
(cl.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 的评论