百度apollo源码学习(一) DEFINE

您所在的位置:网站首页 cpu温度过80 百度apollo源码学习(一) DEFINE

百度apollo源码学习(一) DEFINE

2024-07-02 11:01:46| 来源: 网络整理| 查看: 265

文章目录 前言源码解读SFINAE机制举例 参考

前言

最近学习百度apollo源码,发现很多看不懂的代码,因才疏学浅,只能通过上网搜索,逐步理解,然后将理解完成的内容再次进行记录,其中参考了很多其他博主的博客。 我觉得对于程序员来说,看优秀的代码是进步最快的方式,看代码不仅要看懂代码,还要看明白设计者设计该部分代码的框架。 废话不多少,接下来看一下apollo中基于C++类型萃取实现的结构体成员变量或函数的存在性判断的宏定义:DEFINE_TYPE_TRAIT该宏定义位于:cyber/base/macros.h中。

源码 #define DEFINE_TYPE_TRAIT(name, func) \ template \ struct name { \ // 仅当T是一个类类型时,“Class::func”才是存在的,从而这个泛型函数的实例化才是可行的 // 否则,就将触发SFINAE template \ static constexpr bool Test(decltype(&Class::func)*) { \ return true; \ } \ // 仅当触发SFINAE时,编译器才会“被迫”选择这个版本 template \ static constexpr bool Test(...) { \ return false; \ } \ \ static constexpr bool value = Test(nullptr); \ }; \ \ template \ constexpr bool name::value; 解读

这个宏定义创建了一个struct name的结构体constexpr bool name::value的变量。 第6-15行使用了SFINAE机制,定义了模版类型的Test函数。具体参看【C++深陷】之“decltype”和C++模板SFINAE特性与反射机制

从名字可以知道这段代码的目的是定义一个名为name的类型萃取器,这个萃取器的name::value是bool类型,可以判定T中是否有func函数。使用如下:

DEFINE_TYPE_TRAIT(HasByteSize, ByteSizeLong) //定义HasByteSize的结构体,func为ByteSizeLong

DEFINE_TYPE_TRAIT 会根据宏参数 name 创建一个同名的类型萃取模板类,并检查模板类型参数 T 中是否包含与宏参数 func 同名的方法,若包含,则模板类的 value 成员被置为 true,否则置为 false。应该注意的是,func 在 T 中必须是公有的,否则无法被发现。

所以 DEFINE_TYPE_TRAIT(HasByteSize, ByteSizeLong) 的具体含义是:创建类型萃取模板类 HasByteSize,HasByteSize可检查模板类型参数 T 中是否包含 ByteSizeLong方法。

HasByteSize::value \\ true 表示有A.ByteSizeLong() //在宏定义中为name::value,即HasByteSize.value, Test(nullptr) //这里的模版T就是A,那么4-7行Test模版中Class就是这里的A。 HasByteSize::value \\ false 表示没有B.ByteSizeLong()

其中A和B可以是结构体或者类。

SFINAE机制

C++模板提供了一个SFINAE(subsitate failure is not an error)的机制(模板匹配失败不是错误),这是模板里面一个非常有意思的特性,利用这个机制可以检查一个结构体是否包含某个成员等操作。c++语言本身没有提供反射机制(也有利用pb实现反射),利用SFINAE机制,可以实现类似于反射的功能。

举例 #include #include // A类型包含size函数 struct A { int size() { return 0; } }; struct B { int Size() { return 1; } }; // type trait template struct HasSize { template static constexpr bool Test(decltype(&Class::size)*) { return true; } template static constexpr bool Test(...) { return false; } static constexpr bool value = Test(nullptr); }; int main() { if (!HasSize::value) { std::cout return true; }

value = Test(nullptr)也就自然而然被初始化为true。否则,便会是false。 运行上述结果,因为B::size()不存在,可以看到最后输出了结果。

参考

【C++深陷】之“decltype” C++模板SFINAE特性与反射机制 由一道C++面试题引发的思考 深入探索单例设计模式:以百度 Apollo 为例 C++ type_traits和SFINAE的一点理解



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭