boost::lexical_cast
は優れたツールですが、私のアプリケーションではstring -> bool
変換の制限に遭遇し、私を悩ませていました。、 、 、 、"0"
、 、"false"
などのすべての文字列"FALSE"
をに変換する必要があります。false
"1"
"true"
"TRUE"
true
boost::lexical_cast
との間の変換のみをサポート"0"
し"1"
ます。だから私の考えは、うまくいくように見える私自身の変換関数を書くことでした:
bool str_to_bool(const std::string &str)
{
if(str == "1" || str == "true" || str == "TRUE")
return true;
else if(str == "0" || str == "false" || str == "FALSE")
return false;
else
throw std::runtime_error("Bad cast from std::string to bool!");
}
ここで、ラッパー ラウンドboost::lexical_cast
を作成し、独自のテンプレートの特殊化を作成したいと考えています。これが私がこれまでに得たものです:
template<typename Target, typename Source>
inline Target my_cast(const Source& src)
{
return boost::lexical_cast<Target>(src);
}
template<>
inline bool my_cast(const std::string& src)
{
return str_to_bool(src);
}
これは整数または std::string に対してはうまく機能しますが、文字列リテラルまたは文字ポインターに対しては明らかに失敗します。
int main(int argc, char* argv[])
{
std::cout << my_cast<bool>(1) << std::endl; //OK
std::cout << my_cast<bool>(std::string("true")) << std::endl; //OK
std::cout << my_cast<bool>("true") << std::endl; //Fail!
return 0;
}
だから私は別の特殊化を書こうとしましchar *
たが、コンパイルに失敗しました!
//does not compile!
template<>
inline bool my_cast(const char*& src)
{
return str_to_bool(src);
}
std::string と の両方をサポートする正しい方法は何char *
ですか?
編集 1: タイトルはばかげていた。修正しました。
EDIT 2:ブースト自体からソリューションを借りました。新しい回答として投稿されました。