跳转至

条款4: 掌握查看型别推导结果的方法


我们在三个阶段需要知道型别推导的结果:

  1. 撰写代码阶段
  2. 编译阶段
  3. 运行时阶段

IDE编辑器

在编译阶段,我们可以借助IDE编辑器。通常将鼠标悬停在某个程序实体,如变量、形参、函数等时,IDE会显示出实体的型别。

要注意的是,对于像int这样的平凡型别,从IDE得到的信息大体良好。一旦较为复杂的型别现身,IDE显示的信息就不太有用了。

编译器诊断信息

在编译期显示推导出的型别,一条有效途径是令编译器报错,提示错误的型别。

具体方法则是,声明而不定义一个类模板:

template<typename T>
class TD;

然后写下如下代码:

TD<decltype(x)> xType;          // 诱发x的型别的错误消息

由于模板没有定义,编译器必然会报错,报错内容则包含着x的型别。

运行时输出

运行时输出的工具有标准库提供的typeid和typeinfo。

如:

std::cout << typeid(x).name();

typeid返回一个typeinfo对象,它的方法name()的到一个const char*字符串来代表型别。

但这种方法也有问题,一个是其输出的字符串描述会略显奇怪,且不同厂商的编译器得到的结果也不一样,比如int可能显示成i。

更有甚者,它可能得不到正确的结果。书本里给出了一个模板型别推导的例子可供参考。同时说明:

标准规格上说,std::type_info::name中处理型别的方式就仿佛是向函数模板按值传递形参一样。

所以不能够依赖它能得到准确无误的型别。

那么有什么其他办法吗?有。书中介绍了Boost的TypeIndex库。它提供的方法可以得到准确的型别。

Note

总结就是,我们可以用各种方法得到型别推导结果,但理解型别推导的规则才是无可替代的。