Следующая программа:
#include <boost/container/string.hpp>
#include <boost/lexical_cast.hpp>
#include <folly/FBString.h>
#include <iostream>
class foo { };
std::ostream& operator<<(std::ostream& stream, const foo&) {
return stream << "hello world!\n";
}
int main() {
std::cout << boost::lexical_cast<std::string>(foo{});
std::cout << boost::lexical_cast<boost::container::string>(foo{});
std::cout << boost::lexical_cast<folly::fbstring>(foo{});
return 0;
}
дает этот вывод:
hello world!
hello world!
terminate called after throwing an instance of 'boost::bad_lexical_cast'
what(): bad lexical cast: source type value could not be interpreted as target
Это потому что lexical_cast
не понимает, что fbstring
это string
типа, и просто делает это обычно stream << in; stream >> out;
для преобразования. Но operator>>
для строк останавливается на первом пробеле, lexical_cast
обнаруживает, что весь ввод не был использован, и выдает исключение.
Есть ли способ научить lexical_cast
около fbstring
(или, вообще говоря, любой string
типа)
Смотря на lexical_cast
документация кажется, что std::string
явно единственное строковое исключение, разрешенное для нормальной семантики лексического приведения, чтобы сохранить значение приведения как можно более простым и перехватить как можно больше возможных ошибок преобразования. В документации также сказано, что для других случаев использовать альтернативы, такие как std::stringstream
,
В твоем случае я думаю to_fbstring
метод будет идеальным:
template <typename T>
fbstring to_fbstring(const T& item)
{
std::ostringstream os;
os << item;
return fbstring(os.str());
}
Других решений пока нет …