我如何使用boost :: lexical_cast与folly :: fbstring?

时间:2016-05-09 17:18:29

标签: c++ boost lexical-cast folly

以下计划:

#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类似的类型)?

1 个答案:

答案 0 :(得分: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());
}