2011-09-19 111 views
4

我想获取类型名称并打印出来用于调试目的。我使用下面的代码:在C++编译时获取类型名称

#include <cxxabi.h> 

inline const char* demangle(const char *s) { 
    abi::__cxa_demangle(s, 0, 0, NULL); 
} 

template<typename T> 
inline const char* type_name() { 
    return demangle(typeid(T).name()); 
} 

它运行良好,但它我认为有不必要的运行时间开销。有没有什么办法可以获得编译时计算出来的类型为ID的人类可读形式?我正在考虑看起来像这样的东西:

boost::mpl::type_name<MyType>::value 

这将返回类型名称的字符串常量。

作为一个(不是很严格)相关的问题:是否有可能使用boost :: mpl进行字符串处理?

+0

请一次提出一个问题。 –

回答

5

我看不到typeid(T).name()会导致运行时间开销。 typeid(expr)是的,如果expr属于多态类型。

它看起来像demangling可能发生在运行时,但并没有太多可以做的事情。如果这只是为了调试,那么我真的不会担心它太多,除非你的分析器表明这导致你的程序放慢速度,以至于调试其它元素都很麻烦。

+0

是的,我问是否可以在编译时进行解除匹配。 – petersohn

+0

@petersohn:这是“是否”! –

+0

在编译时无法完成取消。由于C++ ABI与操作系统进行通信的方式(http://en.wikipedia.org/wiki/Name_mangling#Standardised_name_mangling_in_C.2B.2B段落“C++中的标准化名称修改”) – Marcin

1

你可以使用std :: type_index来缓存demangled字符串。

1

您可以使用std :: map或类似的数据结构(例如展示树)来相对快速地缓存和访问demangled名称。虽然在编译时没有完成,但我怀疑后者是可能的。

2

我有同样的需要,我已经使用__ 功能 __ maccro在我的类的静态方法来解决它。 但是您必须对__ 功能 __做一些runtine计算来提取类名。你必须做一些模板技巧,以避免在每个类中粘贴相同的代码。如果有人有什么要求,我可以清理并将我的代码从法文翻译过来。

该方法的主要优点在于您不需要启用RRTI即可启用。另一方面,类名的提取可能依赖于编译器。