【发布时间】:2022-10-23 20:48:49
【问题描述】:
这里我们有来自cppreference.com 的is_base_of 模板实现:
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
> { };
还有一些私人的遗产:
class A {};
class B : A {};
is_base_of<A,B>::value 给出真实的声明号。 3是最好的搭配。声明编号1 作为候选者失败(传递了一个指向私有子类对象的指针)和声明号。 2 被忽略。但为什么? void* 不是每个指针类型的好匹配吗?如果声明没有。 3 未提供代码无法编译。我的问题是为什么声明没有。 3 需要提供此代码才能成功编译吗?为什么声明没有。 1和没有。 2还不够?
【问题讨论】:
标签: c++ overloading template-meta-programming function-templates-overloading