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

tuu*_*uun 5 c++ type-inference c++11

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

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

  1. 输出有时难以理解.(例如,"NSt3__16vectorIiNS_9allocatorIiEEEE")
  2. 似乎没有显示const/volatile修饰符.

@πάνταῥεῖ我试过用你指出的abi :: __ cxa_demangle().问题1解决了,谢谢,但是typeid().name()似乎不包含CV修饰符信息.我认为使用auto关键字有一些缺陷,所以我希望看到类型推断的确切结果,包括CV修饰符和引用类型.

我在mac os 10.10.3上使用clang 6.1.0,但我想知道可移植的方式来做到这一点,如果可能的话.

Dan*_*iel 7

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

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

template<typename T>       // declaration only for TD;
class TD;                  // TD == "Type Displayer"
Run Code Online (Sandbox Code Playgroud)

然后使用您的类型实例化此模板

TD<decltype(x)> xType
Run Code Online (Sandbox Code Playgroud)

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

错误:聚合'TD <int> xType'的类型不完整,无法定义

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


Joh*_*hny 5

最近将类型索引库添加到Boost中.它试图解决你提到的一些问题.

例:

cout << boost::typeindex::type_id<int const volatile*>().pretty_name() << endl;
cout << boost::typeindex::type_id_with_cvr<int const&>().pretty_name() << endl;
Run Code Online (Sandbox Code Playgroud)

打印:

int const volatile*
int const&
Run Code Online (Sandbox Code Playgroud)