我需要打印缩进的模板名称以进行调试.
例如,我想缩写名称,而不是单行,而不是单行:
例如,我想缩写名称,而不是单行,而不是单行:
boost::phoenix::actor< boost::phoenix::composite< boost::phoenix::less_eval,boost::fusion::vector< boost::phoenix::argument<0>,boost::phoenix::argument<1>,
我开始写自己的但是变得复杂了.
有现成的解决方案吗?
如果没有,你能帮助我完成我的实施吗?
如果是的话,我会发布它.
谢谢
这就是typeid.name的样子,
boost::phoenix::actor<boost::phoenix::composite<boost::phoenix::less_eval,boost::fusion::vector<boost::phoenix::argument<0>,boost::phoenix::composite<boost::phoenix::multiplies_eval,boost::fusion::vector<boost::phoenix::argument<1>,boost::phoenix::argument<2>,boost::fusion::void_,boost::fusion::void >,boost::fusion::void_> > >
这是我的目标
6 boost::phoenix::actor< 7 boost::phoenix::composite< 8 boost::phoenix::less_eval,9 boost::fusion::vector< 10 boost::phoenix::argument<0>,11 boost::phoenix::composite< 12 boost::phoenix::multiplies_eval,13 boost::fusion::vector< 14 boost::phoenix::argument<1>,15 boost::phoenix::argument<2>,16 boost::fusion::void_,17 boost::fusion::void_,18 boost::fusion::void_,19 boost::fusion::void_,20 boost::fusion::void_,21 boost::fusion::void_,22 boost::fusion::void_,23 boost::fusion::void >,// indentation messed up 24 boost::fusion::void_,25 boost::fusion::void_,26 boost::fusion::void_,27 boost::fusion::void_,28 boost::fusion::void_,29 boost::fusion::void_,30 boost::fusion::void_,31 boost::fusion::void_ 32 > 33 > 34 >
这样我才能真正阅读宣言
解决方法
当然不是最优雅的作品,但这应该让你了解结束标签:
std::string indent(std::string str,const std::string &indent = " ") { std::string indent_ = std::string("\n"); size_t token = 0; while ((token = str.find_first_of("<>,",token)) != std::string::npos) { switch(str[token]) { case '<': indent_.append(indent); case ',': str.insert(token + 1,indent_); break; case '>': indent_.erase(indent_.size() - indent.size()); str.insert(token,indent_); } token += indent_.size() + 1; const size_t nw = str.find_first_not_of(" ",token); if(nw != std::string::npos) { str.erase(token,nw-token); } } return str; }