我正在研究C ++ 11/14的自动功能。
出于教育目的,我想明确显示我的代码类型推断的结果。 我尝试了typeid()。name(),但我发现这种方法存在两个问题。
@πάνταῥεῖ我试过使用你指出的abi :: __ cxa_demangle()。
问题1解决了,谢谢,但是typeid()。name()似乎不包含CV修饰符信息。
我认为使用auto
关键字存在一些缺陷,所以我希望看到类型推断的确切结果,包括CV修饰符和引用类型。
我在mac os 10.10.3上使用clang 6.1.0,但如果可能的话,我想知道可移植的方式。
答案 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&