2016-05-09 10 views
2

Следующая программа:Как использовать 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)?

ответ

1

Глядя на документации 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()); 
} 
+0

Да, похоже, вы правы. Логика зарывается в 'boost/lexical_cast/detail/converter_lexical_streams.hpp' без простейшего способа ее настройки. Я закончил тем, что написал собственную оболочку 'lexical_cast', которая делегирует' boost :: lexical_cast' специализацию для 'fbstring'. –