1. ホーム
  2. c++

c++でtypename Tをstringに変換する方法 [重複]。

2023-10-28 16:59:29

質問

c++のテンプレートで遊んでいるとき、typename Tを文字列に変換する問題に遭遇しました。例えば

template <typename T>
class Matrix {
   public:
        Matrix() {
           //my_type = string type of T. i.e. if T is char. I want my_type to be "char".
        }
   string my_type;
}

Tが何であるかを示す文字列に変換するにはどうすればよいのでしょうか。

注:あくまでお遊びなので、いつそのようなものが必要になるかについてはご心配なく。

どのように解決するのですか?

このための組み込みのメカニズムはありません。

typeid(T)::name() はいくつかの情報を与えることができますが、標準はこの文字列を人間が読めるようにすることを義務づけていません; ただ、それはそれぞれのタイプについて明確でなければなりません。(例: Microsoft Visual C++ は人間が読める文字列を使用しますが、GCC は使用しません)。

しかし、あなた自身のシステムを構築することができます。たとえば、特質ベースです。このようなものです。

// default implementation
template <typename T>
struct TypeName
{
    static const char* Get()
    {
        return typeid(T).name();
    }
};

// a specialization for each type of those you want to support
// and don't like the string returned by typeid
template <>
struct TypeName<int>
{
    static const char* Get()
    {
        return "int";
    }
};

// usage:
const char* name = TypeName<MyType>::Get();