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: название было глупым. Исправлено.
РЕДАКТИРОВАТЬ 2: Я позаимствовал решение от самого повышения. Опубликовано как новый ответ .