2016-09-25 14 views
1

Tkeyが有効なキーでない場合、タイプdomain_errorの例外をスローしたいとします。 しかし、T::operator std::string()が定義されている限り、どのようにタイプTを文字列に変換できるかわかりません。たとえば、intはこれをサポートしていません。Excpetionメッセージ:誤った値の文字列の挿入

、それは非常に特定のタイプのために働くように、これは、obvioulsy間違っている:

throw std::domain_error("key error: "+static_cast<std::string>(key)); 

はどのようにこれを行うことができますか?

編集

テンプレートspecilisation

template <class T> std::string to_string(const T t) 
    { 
     return static_cast<std::string>(t); 
    } 

    template <> std::string to_string<unsigned int>(const unsigned int i) 
    { 
     std::stringstream ss; 
     std::string ret; 
     ss << i; 
     ss >> ret; 
     return ret; 
    } 

を使用するために提案した後私のソリューション...

std::string domain_error(const IS& is) const 
    { 
     using namespace IDTranslator_detail; 
     return "key error: "+to_string(is), "error"; 
    } 

...

throw std::domain_error(domain_error(key)); 

答えて

1

それはすることはできません説明したように、すべての状況の100%で

テンプレートのコントラクトの一部は、どのクラスがパラメータとして渡されても、operator std::stringをサポートする必要があることを指定する必要があります。

契約の一部として数値型も許可することができ、std::to_stringを使用する特殊化としてテンプレートに実装することができます。堅牢な実装のために

は、このような状況で私がstd::to_stringoperator std::stringをしようとするSFINAEを使用して、両方失敗した場合、例外メッセージで「未知のタイプ」のように、いくつかの当たり障りのないラベルを使用します。たぶん私のコンパイラのデマングラーと一緒にtypeidを使って、少なくとも、C++の型名を取得してください。

+0

ありがとう、私はテンプレートの専門をしました。 –

関連する問題