データを解析するためのテンプレート クラスを開発する場合、解析が失敗した場合に有益なエラー メッセージを生成する必要が生じる場合があります。包括的なエラー メッセージを提供するには、テンプレート関数が変換しようとしている型の名前を知る必要がある場合があります。
以下のコード スニペットは、特殊化を使用して型名を取得しようとする元のコードを示しています。文字列の場合:
template<typename T> T GetValue(const std::wstring &section, const std::wstring &key) { 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);} //needs to get the name from T somehow catch(...)throw ParseError(file, section, key, it->second, TypeName(T)); } }
別の解決策には、次の使用が含まれます:
typeid(T).name()
typeid(T) 関数は、マングルされた型名へのアクセスを提供する std::type_info のインスタンスを返します。 std::type_info の name() メソッドは、デマングルされた型名を返します。
このソリューションをコードに統合すると、catch ブロックを次のように変更できます。
catch(...)throw ParseError(file, section, key, it->second, typeid(T).name());
このアプローチにより、明示的な特殊化を必要とせずに、型名を取得するためのより柔軟かつ効率的な方法が提供されます。
以上が有益なエラー メッセージを得るために C テンプレートの型名を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。