一段时间以来,我一直在使用一些解构代码来帮助进行一些调试,而不必编写数千行动态强制转换或实现返回类名的虚函数。
template <class CLASS>
std::string getClassName(CLASS &theObject)
{
int status = 0;
// Convert real name to readable string
char *realName = abi::__cxa_demangle(typeid(theObject).name(), nullptr,
nullptr, &status);
ASSERT(status == 0); // Assert for success
VERIFY(realName, return std::string());
// Return as string + prevent memory leaks!
const std::string result(realName);
free(realName);
return result;
}
这段代码背后的想法很简单,输出我们实际使用的类。虽然在切换到 Ubuntu 14.04 后,我不再能够使用 clang 和 c++-11/c++-14 标准进行编译,所以我已经切换到使用 libc++ 而不是 libstdc++。
切换到 libc++ 后,我注意到当我对 'std::string' 进行 demangle 时,它不再输出 'std::string',而是输出:
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >
当然这是正确的,因为 std::string 是 std::basic_string 的 typedef。尽管据我所见,在 libc++ 和 libstdc++ 中,这都是使用 typedef 以相同的方式定义的。所以我真的不明白为什么通过切换到 libc++ 来改变这种拆解。
有人知道为什么这是不同的,如果 CLASS 是“std::string”,如何获得“std::string”,当 CLASS 是“myTemplate”时如何获得“myTemplate”?
提前Tnx!
JVA笔