Следующая программа:Как использовать boost :: lexical_cast с безумием :: fbstring?
#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
-like type)?
Да, похоже, вы правы. Логика зарывается в 'boost/lexical_cast/detail/converter_lexical_streams.hpp' без простейшего способа ее настройки. Я закончил тем, что написал собственную оболочку 'lexical_cast', которая делегирует' boost :: lexical_cast' специализацию для 'fbstring'. –