我正在尝试在编译期间确定A是否是B的非虚拟祖先,而不使用任何第三方工具或'is_base_of'。经过相当多的搜索后,我学到了一些关于SFINAE机制的知识,这就是我提出的代码:
template <typename P>
struct helper : public P {
};
template <typename CHILD, typename PARENT>
struct appendix : public CHILD, public helper<PARENT> {
static constexpr appendix<CHILD,PARENT>* getClassType();
static bool val(PARENT* p);
static int val(...);
enum {
value = sizeof(val(getClassType())) == sizeof(bool)
};
};
我的想法是,如果PARENT是CHILD的祖先,那么模糊的转换错误将导致编译器使用'val'的秒定义,而只是给出了编译错误。
1)有人可以建议一个有效的解决方案吗?
2)为什么上面的代码片段不起作用?在与模板相关的任何事情上我都不是专家(看起来很难成为这个主题的专家)但我不明白为什么它不起作用
编辑:禁止使用static_cast