私は、動的キャストを使用して何千行も記述したり、クラス名を返す仮想関数を実装したりすることなく、デバッグを支援するために、すでにいくつかのデマングリング コードを使用してきました。
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 標準を使用してコンパイルできなくなったため、libstdc++ の代わりに libc++ を使用するように切り替えました。
libc++ に切り替えた後、「std::string」をデマングルすると、「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ペン