を参照してくださいboost::lexical_cast
。>>
基本的に、あなたはあなたが望むことをしない場合に特化する必要があります。string_to_T<std::string>
たとえば、ノーオペレーションになりたい場合は
、スペシャライゼーションを作成します。
template<>
std::string
string_to_T<std::string>( std::string const& s )
{
return s;
}
より複雑なケースでは、機能オブジェクトに転送して部分的な特殊化を使用できますが、説明するケースでは、これは必要ありません。
その間、おそらくエラー処理について考える必要があります。string_to_T<int>
を呼び出し、入力が「abcd」の場合はどうなりますか?さらに言えば、で呼び出す
string_to_T<int>
と"1 2 3 4"
、結果は1になるのでしょうか、それともエラーになるのでしょうか。
編集:
質問に対するコメントをもっと見てきました。実行時に戻り値の型を変更することはできません(クラス階層内の参照またはポインターを返す場合の特定の非常に限られた例外を除きます)。C ++は静的に型付けされた言語であり、すべての式には、コンパイル時に決定される個別の型があります。2つの異なるタイプを返すことができると仮定すると、関数をどのように使用するか、およびコンパイラーが検出に必要なタイプエラーをどのように検出できるかを示します。最も近いのは、さまざまなタイプへの暗黙の変換を使用して、ある種のプロキシを返すことですが、変換先のタイプは、結果の処理に応じて静的に決定されます。これをに割り当てますint
。int
文字列の内容に関係なく、に変換します。
このタイプの安全性は機能です。コンパイル時にエラーを検出すると、エラー検出を実行時に延期するよりもはるかに堅牢で確実なコードになります。この安全性なしで実行でき(重要ではないアプリケーション)、ランタイムタイピングの柔軟性を追加する必要がある場合、C++は適切な言語ではありません。Pythonのようなものを使用する必要があります。
編集2:
あなたのコメントに応えて、解決策は次のようなもののように思われます:
class ToStringHelper
{
std::string myValue;
public:
ToStringHelper( std::string const& value )
: myValue( value )
{
}
operator std::string() const
{
return myValue;
}
template <typename T>
operator T() const
{
std::istringstream cvt( myValue );
T results;
cvt >> results;
// Error checking here...
return results;
}
};
ToStringHelper
string_to_T( std::string const& s )
{
return ToStringHelper( s );
}
この正確なパターンを構成データに使用します(エラーが例外をトリガーします)。