Effective Modern C++: Item 4 -> 知道如何查看推断类型

来源:互联网 发布:java年度工作总结 编辑:程序博客网 时间:2024/05/21 15:01

知道如何查看推断类型

查看推断类型的工具选择其实决定于你想在软件开发的什么阶段看到这些信息。我们将探索三种可能:在你编辑代码的时候查看,编译的时候查看以及运行的时候查看

集成开发环境(IDE)编辑器

在IDE里面的代码编辑器里,当你将鼠标光标停留在program入口处(比如说变量名,参数或者函数等),一般来说会显示出入口处的类型。例如,考虑下面的代码:

const int theAnswer = 42;auto x= theAnswer;auto y = &theAnswer;

一个IDE的编辑器应该会显示x的推断类型是inty的推断类型是const int*

为了让这个可以work,你的代码必须处于或多或少可编译的状态,因为IDE实现这个的途径就是给运行在其内部的C++编译器(或者至少编译器前端)提供这类信息。如果一个编译器不能从你的代码中得到足够的信息去处理它并进行类型推断,那么它将不能显示出推断类型。

对于简单类型如int,来自于IDE的信息基本上是足够的,但是我们后面会看到,对于更加复杂的类型,IDE显示的信息却不一定有什么帮助。

编译器诊断

一种使得编译器显示出它推断出来的类型的有效方法就是使用该类型,然后写出一段编译报错的代码。关于该问题的错误信息一般会显示出导致该问题的类型。

假设,我们想看上面例子中给xy推断出来的类型。我们首先声明一个我们不会定义的类模板,就像这样的:

template<typename T>    //declaration only for TDclass TD;               // TD = "Type Display"

任何尝试实例化该模板的操作都报告错误信息,因为没有模板定义可以实例。为了看xy的类型,就尝试用他们的类型来实例化TD

TD<decltype(x)> xType;//elicit errors containing x's and y's typesTD<decltype(y)> yType;

我按照variableNameType这种形式给变量命名,因为这样可以帮助我找到我需要寻找的变量的错误信息。对于上面的代码,我的一个编译器提示如下诊断信息:

error:aggregate 'TD<int> xType' has incomplete type and cannot be definederror:aggregate 'TD<const int *> yType' has incomplete type and cannot be defined 

另一个不同的编译器提供了如下诊断信息,格式有点不一样:

error:'xType' uses undefined class 'TD<int>'error:'yType' uses undefined class 'TD<const int *>'

抛开输出格式,我测试过的所有编译器都产生了带类型信息的错误消息。

运行时输出

这个可以自己看啦~
我后面再把这部分翻译出来。。

要点记忆

  • 推断类型一般可以通过使用IDE的编辑器,编译器错误信息以及Boost TypeIndex库来看
  • 一些工具的结果可能既没有用也不准确,所以对于C++的类型推断的理解是至关重要的
阅读全文
0 0
原创粉丝点击