プリプロセッサを使用して変数の名前を表示することができます。
#define STRINGIFY(a) #a
#define VAR_NAME(a) STRINGIFY( a)
int my_var = 42;
std::cout << "var name = " << VAR_NAME( my_var) << std::endl;
テンプレートクラスのオーバーロードを使用できるクラスの名前を取得すると、名前を取得する型ごとにこのクラスの部分的な特殊化を実装するだけで済みます。
template< typename T> class type
{
public:
static constexpr const char* name() {
return "unknown";
} // end type< T>::name
}; // type< T>
template<> class type< int>
{
public:
static constexpr const char* name() {
return "int";
}
}
template<> class type< std::string>
{
public:
static constexpr const char* name() {
return "std::string";
}
}
std::cout << "type name = " << type< int>::name() << std::endl;
すべての POD タイプと STL コンテナーのこのようなクラスと特殊化は、
https ://github.com/Gemini67/Celma から入手できます。
変数の型名を取得するためのソリューションも含まれています。