小编mcz*_*mcz的帖子

从 cppreference 理解 std::is_base_of 可能的实现

这里我们有is_base_of来自cppreference.com的模板实现:

namespace details {
     template <typename B>
     std::true_type test_pre_ptr_convertible(const B*);      //1
     template <typename>
     std::false_type test_pre_ptr_convertible(const void*);  //2

     template <typename, typename>
     auto test_pre_is_base_of(...)->std::true_type;          //3
     template <typename B, typename D>
     auto test_pre_is_base_of(int) ->
         decltype(test_pre_ptr_convertible<B>(static_cast<D*>(nullptr))); 
 }

template <typename Base, typename Derived>
 struct is_base_of :
     std::integral_constant<
     bool,
     std::is_class<Base>::value&& std::is_class<Derived>::value&&
     decltype(details::test_pre_is_base_of<Base, Derived>(0))::value
     > { };
Run Code Online (Sandbox Code Playgroud)

还有一些私有继承:

class A {};
class B : A {};
Run Code Online (Sandbox Code Playgroud)

is_base_of<A,B>::value给出 true 和声明号。3 是最佳匹配。声明编号 1 作为候选者失败(传递了一个指向私有子类对象的指针)并且声明号。2 被忽略。但为什么?不是void*每个指针类型都能很好匹配吗?如果声明没有。3 未提供代码将无法编译。我的问题是为什么声明没有。3 需要提供此代码才能成功编译吗?为什么声明没有。1 和没有。2个还不够?

c++ overloading template-meta-programming function-templates-overloading

6
推荐指数
1
解决办法
197
查看次数