Как я могу использовать boost :: lexical_cast с folly :: 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типа)

2

Решение

Смотря на 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());
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]