デバッグの目的で (c++11 モードで g++4.6 を使用する Linux プラットフォームで)、テンプレートがインスタンス化された正確な型を知りたいと思いました。同様のことが以前に議論されました: Print template typename at compile timeとHow to convert typename T to string in c++ , しかし、私は解決策に満足していません. 次のコードを思いつきました:
#include <typeinfo>
#include <type_traits>
#include <string>
template<typename FIRST> std::string typeName() {
std::string tName;
// get name of the type (and remove the '\n' at the end)
FILE *fp = popen((std::string("c++filt -t ") + std::string(typeid(FIRST).name())).c_str(), "r");
char buf[1024]; fgets(buf, 1024, fp); fclose(fp);
tName += buf; tName.erase(std::prev(tName.end()));
// check whether we have a const qualifier
if(std::is_const<FIRST>::value) { tName += " const"; }
// check whether type declares a volatile variable
if(std::is_volatile<FIRST>::value) { tName += " volatile"; }
// check for lvalue and rvalue references
if(std::is_lvalue_reference<FIRST>::value) { tName += "&"; }
if(std::is_rvalue_reference<FIRST>::value) { tName += "&&"; }
return tName;
}
template<typename FIRST, typename SECOND, typename... OTHER> std::string typeName() {
return typeName<FIRST>() + ", " + typeName<SECOND, OTHER...>();
}
#include <iostream>
int main() {
std::cout << typeName<std::string*&, int&&, char const* const>() << std::endl;
return 0;
}
によってコンパイルされたとき
g++ -std=gnu++0x -o test test.cpp
それは印刷します
std::basic_string<char, std::char_traits<char>, std::allocator<char> >*&, int&&, char const* const
基本的に、私は出力にかなり満足していますが、c++filt の呼び出しを介してデエンジェルされた型名を取得する方法は、かなり厄介です。同じ出力を達成する別の方法がありますか?
ヒントをありがとう!