【发布时间】:2021-05-20 00:29:08
【问题描述】:
我遇到了在不完整类型的类声明中调用 std::is_base_of 的问题。我遇到了这个 StackOverflow 问题:Why can't "is_base_of" be used inside a class declaration (incomplete type)?
然后我尝试实现我自己的元函数来检查给定的模板类是否是另一个的基础。
我已经在MSVC 19.28.29337(cl.exe 报告的版本)和clang-7online compiler 上使用C++17 测试了我的代码,并且似乎它完美地工作无论是完整的还是不完整的类。这是我的代码:
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。
【问题讨论】:
-
您的方法有一个缺陷:它声称
void是一个基类:Demo on coliru -
它也不处理非公共继承。
-
您询问的所有代码都需要内联发布在问题中。有一个在线编译器的链接很不错,但不一定要遵循它来理解您的问题。链接过时,或者可能无法访问。例如,我所在的网络不允许我加载您的 Repl.it sn-p。
-
@StoryTeller-UnslanderMonica 实际上我已经内联了所有必需的代码。链接是可选的。
-
你肯定没有。你是如何确定“它有效”的?我没有看到任何测试代码。如果答案是“你的测试有缺陷”怎么办?
标签: c++ templates std metaprogramming