汎用テンプレート クラスを使用する場合、多くの場合、テンプレート化されている型の名前を抽出する必要があります。この情報は、データ ファイルの解析に関連するエラー メッセージなど、有益なエラー メッセージを提供するのに役立ちます。
テキスト データ ファイルの解析の場合、一般的な要件は、ユーザーに情報を提供することです。予想されるデータの種類を含む詳細なエラー メッセージが表示されます。たとえば、次のようなエラー メッセージが表示される場合があります。
Error parsing example.txt. Value ("notaninteger") of [MySectiom]Key is not a valid int
上記のテンプレート関数 (GetValue) は、テンプレート関数に渡された引数とクラス内のメンバー変数からファイル、セクション、およびキーの名前を取得します。ただし、予想されるデータのタイプを決定することには問題があることが判明しています。
この問題に対処するには、コンパイル時の解決策が必要です。これにより、テンプレート関数の作成中の実行時のオーバーヘッドが排除されます。これは、関数が頻繁に呼び出され、読み込み時間がすでにある程度長くなってしまっているため、非常に重要です。
解決策は、typeid(T).name() 式を利用することです。typeid(T) は std::type_info オブジェクトを返します。これにより、型の名前が定数文字配列として提供されました。更新されたコード セグメントは次のようになります。
{ std::map<std::wstring, std::wstring>::iterator it = map[section].find(key); if(it == map[section].end()) throw ItemDoesNotExist(file, section, key) else { try{return boost::lexical_cast<T>(it->second);} // throw error with the typename provided catch(...)throw ParseError(file, section, key, it->second, typeid(T).name()); } }
このソリューションは、テンプレート化される型の名前を取得するという課題を効果的に解決し、データ ファイルの解析中に有益なエラー メッセージを提供できるようにします。
以上が有益なエラー メッセージのテンプレート メタプログラミングで型名を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。