boost :: variant <t>到std :: string </t>

时间:2010-12-08 15:30:26

标签: c++ string variant

我有一个类似的提升变体:typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

我需要能够将此变体中的任何值转换为std :: string,我想知道是否有一些我可以用来执行此操作的模板类型函数?

或者最有效的方法是什么?

我目前会实现一堆重载函数,每个函数都使用一个类型,然后使用std::stringstreamposix_time进行转换,我会使用它的转换函数。也许有更好的方法?

4 个答案:

答案 0 :(得分:9)

使用boost::lexical_cast,它将整个stringstream内容隐藏在方便的包装器后面。这也适用于boost :: posix_time,因为它有一个合适的operator<<

答案 1 :(得分:3)

试试这个:

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;
}

答案 2 :(得分:1)

generically convert from boost::variant<T> to type。你应该能够根据自己的情况调整答案。您可以将boost::lexical_cast用于除boost::posix_time::ptime之外的所有类型,您可能需要在其中执行特殊解决方案。所有这些都在static_visitor使用运算符重载(模板+一个用于ptime)。

答案 3 :(得分:0)

将某种类型转换为std::string的更简洁(但不是更有效)的方法是使用

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

#include <boost/lexical_cast.hpp>

要转换的类型需要提供通常的“&lt;&lt;” ostream的运营商。

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