这里我们有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