1. template <typename Base> std::true_type is_base_of_test_func( Base* );
2. template <typename Base> std::false_type is_base_of_test_func( void* );
3. template <typename Base, typename Derived>
using pre_is_base_of = decltype( is_base_of_test_func<Base>( std::declval<Derived*>() ) );
4. template <typename Base, typename Derived, typename = void>
struct pre_is_base_of2 : public std::true_type {};
5. template<typename ...> using void_t = void;
6. template <typename Base, typename Derived>
struct pre_is_base_of2<Base, Derived, void_t<pre_is_base_of<Base, Derived>>> : public pre_is_base_of<Base, Derived>{};
7. template <typename Base, typename Derived>
struct is_base_of : public std::conditional_t<std::is_class<Base>::value && std::is_class<Derived>::value,
pre_is_base_of2<Base, Derived>,
std::false_type>
{
};
第1行和第2行都很简单明了。
然而,第3行中的using
非常模糊,因为我不能简单地将每个pre_is_base_of
的出现替换为其定义。因此,using
并不是文档所说的那样。它还涉及一些信仰问题。如果我没记错的话,pre_is_base_of
的使用应该返回std::true_type
或std::false_type
。
当涉及到void_t
时,我也很茫然。这一行会产生什么魔法效果?
在pre_is_base_of2
的两个实现中,都应该采用3种类型吗?第6行继承有什么意义?可能还有更多问题,但我们先停止吧。
我需要对这里涉及到的魔法进行详细解释。基本上,我正在尝试理解代码如何工作。
编辑:当default问我错误在哪里时,我替换了每个pre_is_base_of
的出现,现在没有错误了。
pre_is_base_of
的定义替换每个出现的实例? - cpplearneris_base_of
的实现是从 http://en.cppreference.com/w/cpp/types/is_base_of 复制过来的。那个实现的作者在相应的讨论页中给出了一些解释。 - cpplearner