boost::variant<T> 转换为 std::string

9

我有一个使用boost的变体,看起来像这样:typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;

我需要能够将此变量中的任何值转换为std::string,我想知道是否有一些模板类型函数可以用来做到这一点?

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

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

4个回答

10

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


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

好的,已更改。我没有编译这个。 - Pawel Zubrycki
不错啊!运用了重载的强大功能。 - Daniel Lidström

1

请查看将boost::variant<T>通用转换为类型。您应该能够将该答案适应到您的情况中。对于除了boost::posix_time::ptime之外的所有类型,您都可以使用boost::lexical_cast,但对于后者,您可能需要做出特殊的解决方案。所有这些都在static_visitor中使用运算符重载(模板加上一个用于ptime)。


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");

实际上,如果在编译时已知类型的字符串表示的最大长度,boost应该使用堆栈数组来进行流缓冲区,这样可以更有效率。但是问题是关于boost::variant的。 - UncleBens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接