9

私はこのように見えるブーストバリアントを持っています:typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

このバリアントの値をstd::stringに変換できるようにする必要がありますが、これを行うために使用できるテンプレートタイプの関数があるかどうか疑問に思いました。

または、最も効果的な方法は何でしょうか?

私は現在、一連のオーバーロードされた関数を実装し、それぞれが型を取り、それを使用して変換を実行します。std::stringstreamまたは、そのposix_time変換関数を使用します。おそらくもっと良い方法がありますか?

4

4 に答える 4

10

boost::lexical_castを使用すると、すべてstringstreamが便利なラッパーの背後に隠されます。これは、適切な があるため、boost::posix_time でも機能しoperator<<ます。

于 2010-12-08T15:33:42.500 に答える
4

これを試して:

struct to_string_visitor : boost::static_visitor<>
{
  std::string str; 

  template <typename T>
  void operator()(T const& item)
  {
    str = boost::lexical_cast<std::string>(item);
  }
  void operator()(boost::posix_time::ptime const & item)
  {
    //special handling just for ptime
  }
};

int main(){
  variant v = 34;
  to_string_visitor vis;
  boost::apply_visitor(vis, v);
  cout << vis.str << endl;
}
于 2010-12-08T15:51:12.310 に答える
1

一般的にboost::Variant<T>からtypeに変換するを参照してください。あなたはその答えをあなたの状況に適応させることができるはずです。おそらく特別な解決策を実行する必要がある場合boost::lexical_castを除いて、すべてのタイプに使用できます。boost::posix_time::ptimeこれはすべて、static_visitorusing演算子のオーバーロード(テンプレート+ ptime用の1つ)で行われます。

于 2010-12-08T15:39:17.487 に答える
0

特定の型をに変換するための、よりクリーンでエレガントな(しかしより効率的ではない)方法std::stringは、使用することです

template<typename Target, typename Source> Target lexical_cast(const Source& arg);

から

#include <boost/lexical_cast.hpp>

変換する型は、ostream の通常の「<<」演算子を提供する必要があります。

使用例: std::string s = boost::lexical_cast<std::string>( 17 ); assert( s == "17" );

于 2010-12-08T15:42:23.307 に答える