在编译期间检查非虚拟继承

时间:2015-06-18 23:59:12

标签: c++ templates metaprogramming sfinae

我正在尝试在编译期间确定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

0 个答案:

没有答案