C テンプレートでの型名の取得
C テンプレート プログラミングでは、変換後の型の名前を取得することが、エラー処理にとって重要な場合があります。 。データ ファイルを解析するテンプレート クラスを考えてみましょう。ほとんどの解析エラーはデータ ファイル エラーに起因します。ユーザーフレンドリーなエラー メッセージを提供するには、予期されるデータ型を特定することが不可欠です。
汎用の GetValue 関数は、セクションとキーの入力に基づいてデータ マップから値を取得します。期待された値を目的の型に変換できない場合は、例外がスローされます。ただし、エラー メッセージに含める予期される型名を決定するのは困難な場合があります。
コンパイル時ソリューション
型を使用すると、エレガントなコンパイル時ソリューションを実現できます。イントロスペクションと定義済みマクロ。関数テンプレート GetTypeName を定義するヘッダー ファイル (types.h) を作成します。
template<typename T> const wchar_t *GetTypeName(); #define DEFINE_TYPE_NAME(type, name) \ template<>const wchar_t *GetTypeName<type>(){return name;}
.cpp ファイルの DEFINE_TYPE_NAME マクロを使用して、データ ファイルの解析プロセスで検出された型の型名を定義します。
DEFINE_TYPE_NAME(int, L"int") DEFINE_TYPE_NAME(float, L"float") DEFINE_TYPE_NAME(std::string, L"std::string")
GetValue 関数内で、以下を使用して型名を取得します。
const wchar_t *typeName = GetTypeName<T>();
このアプローチにより、未定義の型が見つかった場合にリンカー エラーが確実に作成され、必要な型定義の追加が求められます。 .
ランタイム型識別 (RTTI) を使用した代替ソリューション
ランタイム ソリューションは、RTTI を使用して取得できます。
std::type_info(T).name()
ただし、このソリューションは実行時のオーバーヘッドが発生するため、頻繁に呼び出される関数にとっては望ましくありません。
以上がC テンプレートで型名を取得するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。