如何通过auto显式查看类型推断的结果?

时间:2015-04-28 10:16:54

标签: c++ c++11 type-inference

我正在研究C ++ 11/14的自动功能。

出于教育目的,我想明确显示我的代码类型推断的结果。 我尝试了typeid()。name(),但我发现这种方法存在两个问题。

  1. 输出有时难以理解。 (例如,“NSt3__16vectorIiNS_9allocatorIiEEEE”)
  2. 似乎没有显示const / volatile修饰符。
  3. @πάνταῥεῖ我试过使用你指出的abi :: __ cxa_demangle()。  问题1解决了,谢谢,但是typeid()。name()似乎不包含CV修饰符信息。 我认为使用auto关键字存在一些缺陷,所以我希望看到类型推断的确切结果,包括CV修饰符和引用类型。

    我在mac os 10.10.3上使用clang 6.1.0,但如果可能的话,我想知道可移植的方式。

2 个答案:

答案 0 :(得分:7)

尝试Scott Meyers(Effective Modern C ++)提出的方法:

声明模板(但不要定义它)

template<typename T>       // declaration only for TD;
class TD;                  // TD == "Type Displayer"

然后使用您的类型

实例化此模板
TD<decltype(x)> xType

编译器现在会抱怨这个不完整的类型(通常会显示它的全名)

  

错误:聚合'TD&lt; int&gt; xType'的类型不完整,无法定义

参见“有效的现代C ++”第4项(一般我认为这本书是“必读”)

答案 1 :(得分:5)

Type Index library最近加入了Boost。它试图解决你提到的一些问题。

示例:

cout << boost::typeindex::type_id<int const volatile*>().pretty_name() << endl;
cout << boost::typeindex::type_id_with_cvr<int const&>().pretty_name() << endl;

打印:

int const volatile*
int const&