boost::lexical_cast
是一个很棒的工具,但在我的应用程序中,我遇到了一个string -> bool
困扰我的转换限制。我需要将所有字符串如"0"
,"false"
和"FALSE"
转换成false
and "1"
, "true"
and "TRUE"
into 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:标题很愚蠢。修复。
编辑 2:我从 boost 本身借了一个解决方案。发布为新答案。