c – std :: is_base_of的可能实现的说明

c – std :: is_base_of的可能实现的说明,第1张

概述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>
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行:使用时非常模糊,因为我不能简单地用它的定义替换pre_is_base_of的每一个出现.问题,使用并不是文档所说的.它也涉及一些宗教.如果我没错,pre_is_base_of的使用应该返回std :: true_type或std :: false_type.当涉及到voID_t时,我同样迷失了方向.这条线会做什么样的魔术?pre_is_base_of2的两种实现都不应该采用3种类型吗?第6行的继承点是什么?可能还有更多,但现在让我们停下来.

我需要一些关于魔法的详细解释.基本上我试图理解代码是如何工作的.

编辑:当default问我错误是什么时,我替换了pre_is_base_of的每一次出现,现在没有错误.

解决方法
template <typename Base> std::true_type is_base_of_test_func( Base* );

当参数是Base或从Base派生时,此重载具有最高优先级

template <typename Base> std::false_type is_base_of_test_func( voID* );

此重载将匹配任何类型,具有最低优先级

template <typename Base,typename Derived>
using pre_is_base_of = decltype( is_base_of_test_func<Base>( std::declval<Derived*>() ) );

pre_is_base_of将成为通过调用is_base_of_test_func并返回Derived指针返回的类型.如果Derived派生自Base,它将返回std :: true_type,否则将选择voID *重载并返回std :: false_type.现在我们已将函数调用结果转换为类型.

template <typename Base,typename = voID>
struct pre_is_base_of2 : public std::true_type {};

一般情况下,这将是一个true_type.由于第3个模板参数是默认的,因此这将是未创建其他特化时定义的类的版本.

template<typename ...> using voID_t = voID;

这是一种更简单的enable_if方法. voID_t< X>如果X是合法类型,则只会是一种类型.

template <typename Base,typename Derived>
struct pre_is_base_of2<Base,Derived>{};

如果voID_t是合法类型(即pre_is_base_of< Base>(Derived *)是一个有效的表达式,这将是pre_is_base_of2的特化,它将评估为调用上述测试函数的decltype.仅当pre_is_base_of&lt时才会选择它; Base,Derived>是有效类型(即存在对测试函数的调用)

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,
std::false_type>
{
};

基本上这是说:

IF Base and Value are classes AND voID_t<decltype(is_base_of_test_func<Base>(Derived*))> is a typeTHEN    select the type of pre_is_base_of2<Base,voID_t<...is the Expression legal?...>>ELSE    select false_type

更新:

希望这个小小的演示程序能够提供一些清晰度:

#include <type_traits>#include <iostream>template<class...> using voID_t = voID;// this expands in any case where no second type is provIDedtemplate<class T,typename = voID> struct does_he_take_sugar : std::false_type {};// the specialisation can only be valID when voID_t<expr> evaluates to a type.// i.e. when T has a member function called take_sugartemplate<class T> struct does_he_take_sugar<T,voID_t<decltype(std::declval<T>().take_sugar())>> : std::true_type {};struct X {    int take_sugar();};struct Y {    int does_not();};int main(){    // X::take_sugar is a function therefore voID_t<decltype(...X)> will evaluate to voID    std::cout << does_he_take_sugar<X>::value << std::endl;    // Y::take_sugar is not a function therefore voID_t<decltype(...Y)> will not evaluate at all    std::cout << does_he_take_sugar<Y>::value << std::endl;    // int::take_sugar is not even valID c++ voID_t<decltype(...int)> will not evaluate at all    std::cout << does_he_take_sugar<int>::value << std::endl;}
总结

以上是内存溢出为你收集整理的c – std :: is_base_of的可能实现的说明全部内容,希望文章能够帮你解决c – std :: is_base_of的可能实现的说明所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1217676.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存