Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过auto显式查看类型推断的结果?_C++_C++11_Type Inference - Fatal编程技术网

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

C++ 如何通过auto显式查看类型推断的结果?,c++,c++11,type-inference,C++,C++11,Type Inference,我最近在学习C++11/14的自动特性 出于教育目的,我希望显式显示代码的类型推断结果。 我尝试了typeid().name(),但发现这种方法有两个问题 输出有时很难理解。(例如,“NSt3矢量图” 常量/易失性修饰符似乎不显示 @πάνταῥεῖ 我试过使用你指出的abi::\uucxa\uDemangle()。 问题1已解决,谢谢,但typeid().name()似乎不包含CV修饰符信息。 我认为使用auto关键字存在一些缺陷,因此我希望看到类型推断的确切结果,包括CV修饰符和引用类型 我

我最近在学习C++11/14的自动特性

出于教育目的,我希望显式显示代码的类型推断结果。 我尝试了typeid().name(),但发现这种方法有两个问题

  • 输出有时很难理解。(例如,“NSt3矢量图”
  • 常量/易失性修饰符似乎不显示
  • @πάνταῥεῖ 我试过使用你指出的abi::\uucxa\uDemangle()。 问题1已解决,谢谢,但typeid().name()似乎不包含CV修饰符信息。 我认为使用
    auto
    关键字存在一些缺陷,因此我希望看到类型推断的确切结果,包括CV修饰符和引用类型


    我正在mac os 10.10.3上使用clang 6.1.0,但如果可能的话,我想知道实现这一点的便携方法。

    尝试Scott Meyers(有效的现代C++)提出的方法:

    声明模板(但不定义它)

    模板//仅适用于TD的声明;
    TD类;//TD==“类型显示器”
    
    然后使用您的类型实例化此模板

    TD<decltype(x)> xType
    
    TD-xType
    
    编译器现在会抱怨这个不完整的类型(通常会显示它的全名)

    错误:聚合“TDxType”的类型不完整,无法定义

    参见“有效的现代C++”(通常我建议这本书作为“必读”)的第4项。

    最近被添加到Boost中。它试图解决您遇到的一些问题

    例如:

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

    @JBL它不需要是同一个问题,只要有一个合适的答案,并且有IMHO。@πάνταῥεῖ 嗯,最实际的答案不是在副本上,也不太适合imho,但是。。。(虽然确实有一些答案可以帮助他)@JBL好吧,我要重新讨论这个问题,你可以发布一个更好的答案。你使用的是什么编译器和操作系统?是什么?你的意思是什么?啊,该死,这是同一个想法!:D@JBL不完全一样
    decltype(x)
    可能是引用类型,而代码中的
    T
    永远不会是引用类型。@JBL:正如我所说的:必须阅读。。。所以其他人也读过也不奇怪……啊,对了,没听懂。。但是使用
    decltype
    是唯一的方法吗?非常感谢您的快速回复!实际上,我开始阅读“有效的现代C++”,我想检查第1项的实际行为。。。
    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&