首页 >后端开发 >C++ >使用 CRTP 的 C `is_base_of` 实现如何工作?

使用 CRTP 的 C `is_base_of` 实现如何工作?

DDD
DDD原创
2024-11-22 05:40:15170浏览

How Does This C   `is_base_of` Implementation Using CRTP Work?

is_base_of 特征的这种实现是如何工作的?

您提供的代码片段在 C 中实现了 is_base_of 特征,它检查一个类是否从另一个类继承。它使用一种称为“奇怪的重复模板模式”(CRTP)的技术。

它是如何工作的

Host 是一个模板类,它包装派生类并提供访问其运算符 B* 的方法功能。当我们想要检查 B 是否是 D 的基类时,我们调用 is_base_of::value。

  1. 检查函数重载了两个函数:

    • 静态是检查(D*, T)
    • 静态否检查(B*, int)
  2. 主机由于用户定义的转换序列,可以转换为 D* 和 B*。
  3. 如果 B 是 D 的基数,则使用 Host 调用第一个检查函数。转换为 D* 和任意 T。如果转换成功(即 D 继承自 B),检查函数返回 yes。
  4. 如果 B 不是 D 的基,则调用第二个检查函数与主机转换为 B* 并指定 int 的值。如果转换为 B* 成功(即 B 和 D 不相关),则检查函数返回 no。如果检查函数返回 a,则
  5. is_base_of::value 设置为 true yes,否则为 false。

运算符 B* 中 const 关键字的重要性

运算符B* 必须是 const,否则在选择调用哪个检查函数时会产生歧义。通过 const 关键字,编译器知道使用接受 B* const& 的检查函数。

为什么第一个检查函数更好?

第一个检查函数更好,因为它使用了用户- 定义从 D* 转换为 B* 的转换序列。这比第二个检查函数更具体,后者使用用户定义的转换序列从 B* 转换为 int。

以上是使用 CRTP 的 C `is_base_of` 实现如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn