如何将 boost::lexical_cast 与 folly::fbstring 一起使用?
How can I use boost::lexical_cast with 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>>
for strings 在第一个空格处停止,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());
}
以下程序:
#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>>
for strings 在第一个空格处停止,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());
}