2

次のプログラム:

#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ことを認識せず、単純に通常の変換を行っているためです。ただし、文字列の場合、最初の空白で停止し、入力全体が消費されていないことが検出され、例外がスローされます。fbstringstringstream << in; stream >> out;operator>>lexical_cast

lexical_castについて教える方法はありますかfbstring(または、より一般的には、のようstringなタイプ)?

4

1 に答える 1

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());
}
于 2016-05-09T18:18:31.210 に答える