我有一个类似的提升变体:typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;
我需要能够将此变体中的任何值转换为std :: string,我想知道是否有一些我可以用来执行此操作的模板类型函数?
或者最有效的方法是什么?
我目前会实现一堆重载函数,每个函数都使用一个类型,然后使用std::stringstream
或posix_time
进行转换,我会使用它的转换函数。也许有更好的方法?
答案 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" );