【发布时间】:2014-05-02 20:28:22
【问题描述】:
自从我发现boost::lexical_cast 以来,所有的转换都是轻而易举的事。直到尝试将元组元素转换为字符串。像Int2String 或Double2String 我想要一种从任意数量元素的元组生成单个字符串的方法
由于转换的主题具有任意(但编译时间已知)维度,在some research 之后,我查看了boost::fusion 并找到了这个解决方案:
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/noncopyable.hpp>
#include <boost/fusion/include/for_each.hpp>
template <class Sequence>
std::string StringFromSequence(const Sequence &seq)
{
std::string result;
boost::fusion::for_each(seq, toString(result));
return result;
}
toString 是一个函子,将词法转换应用于被调用的对象:
struct toString: boost::noncopyable
{
explicit toString(std::string& res) : result(res)
{
}
template <class T>
void operator()(const T& v)
{
result += boost::lexical_cast<std::string>(v);
}
private:
std::string &result;
};
当尝试使用它时
std::tuple<int, char, double> tup{ 1, 'a', 2.2 };
toString(tup);
我得到一个编译错误
错误 C2893:无法专门化函数模板 'enable_if, void>::type boost::fusion::for_each(const Sequence &,const F &)'
- 有人能发现并纠正错误吗?
- 是否有任何(也许是免费的)替代品? (这需要编译时递归,我希望尽量避免所有样板代码)
【问题讨论】: