文字列を数値に変換するためのテンプレートを継承し、それをブール値に変換するために適用したいと思います。私はstringstreamクラスとlocaleクラスの経験があまりありません。私は奇妙な振る舞いをしているようですが、誰かが私にそれを説明してもらえないかと思います。
template<typename T> T convertFromString( const string& str ) const {
std::stringstream SStream( str );
T num = 0;
SStream >> num;
return num;
}
ブール変換を試すまで、これは正常に機能します
string str1("1");
int val1 = convertFromString<int>(str1); // ok
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _false_
私は問題を追跡するのに少し時間を費やしました。ロケールのtruename()が「true」を返すことを確認しました。
問題は、変数numの初期化にあるようです。テンプレートをこれに変更すると、機能します。
template<typename T> T convertFromString( const string& str ) const {
std::stringstream SStream( str );
T num; // <----------------------- Changed here
SStream >> num;
return num;
}
string str2("true");
bool val2 = convertFromString<bool>(str2); // val2 is _true_
なぜそれが機能するのですか?「0」でブール値を初期化するのは間違っていることを認めますが、なぜこれによりSStream>>num
変換が失敗するのでしょうか。