我正在调试/记忆工具上工作。我想显示来自C++的符号,问题是它们非常冗长。目前我只使用__cxa_demangle
,但由于包含了默认的模板参数,这通常会导致超过500个字符的巨大字符串。简化复杂的C++模板符号
clang++
当它报告符号时可以明确地做出聪明的事情,有什么方法可以利用它吗?
举一个简单的例子,让我们:
std::map<std::string const, unsigned int, std::less<std::string const>, std::allocator<std::pair<std::string const, unsigned int> > >::find(std::string const&)
其中明确可能被报告为:
std::map<std::string const, unsigned int>::find(std::string const&)
..如果我有一个足够聪明的工具。很显然,如果没有额外的知识,就很难做到这一点(比如最初使用的包含内容 - 我可能会了解这些内容),但我会很感激任何提示。
到目前为止,我一直指向libcxxabi,但除了没有公共接口的分析树(这不会阻止我自己),似乎我必须做的努力工作确定哪些参数是默认值。如果我能以某种方式欺骗铛声为我做这件事,那将是非常棒的。
我想我们都希望有更好的模板调试经验。我记得不得不深入研究'boost :: ptr_map'进行调试,因为所有这些默认参数突然显示并填充页面,所以它很糟糕。尽管如此,我的实用主义可能会为一些类型的内置默认参数列表,以及基于此列表的elision。 –
您可以编写自己的逻辑:将参数列表解析为参数,为您关心的模板提供默认映射,并检查参数是否与默认映射匹配(从后面开始)。 –
不知何故,你的简单例子已经很幸运了,因为你显示'std :: string const'而不是'std :: basic_string,std :: allocator > > const'。看起来你已经利用了typedef和specializations? –