暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Item4 知道如何查看类型的推导结果

程序员的Cookbook 2020-07-24
920

   在Item3中学习了C++11新特性decltypedecltype可以获取变量或者表达式的类型,但是获取到的类型只能用于定义其他的变量和类型,不能打印出来,也不能用来操作。毕竟是编译期实现,用来做类型反射就算了,那么至少也应该可以打印输出下吧,毕竟书中得来终觉醒。那么本文就介绍几种方法来得到decltype的返回类型的名字。

  • IDE Editors 最简单的就是依靠C++IDE帮你识别出decltype的返回类型,IDE毕竟不是万能的,所以你要识别的类型要尽可能的简单,不能过于复杂。

  • Compiler Diagnostic 借助于编译器的诊断错误信息。通过错误使用decltype推导出来的类型让编译器报出编译错误,在编译错误的信息中可以发现decltype推导出来的类型名称。例如下面的这个例子:


使用g++编译后,会出现编译出错,诊断信息如下:

从上面的诊断信息就可以得出decltype(x)的结果就是int

  • Runtime Output 最后一种方式就比较专业了,而且还是运行时获取,不光光可以用来验证decltype的返回类型,还可以做运行时的检查,和一些额外的操作,实现的手段则是利用了typeinfo


   上面会输出x的类型的名称,这里应该会输出int,但也不尽然,typeid的输出结果取决于编译器,MSVC的输出是int,而g++的输出则是i,也就是C++int的名称重写后的结果。g++其实也可以实现和MSVC的输出结果一样,

   到此为止typeinfo看似解决了问题,其实不然,通过typeinfo得到的类型会忽略 cv
限制符还有引用,真的是差强人意啊。但是对const的指针类型是不会忽略const限制符的。具体可以参考typeid获取完整类型,幸好可以借助于boost的Boost.Type-Index库得到精确的类型。

Tips

  1. 类型推导可以借助于IDE,或者是编译器的错误输出以及Boost TypeIndex

  2. 一些工具的类型推导结果可能是对我们所有帮助的,但是不一定是准确的,因此理解C++的类型推导规则仍然是必不可少的


文章转载自程序员的Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论