C模板名称漂亮打印

前端之家收集整理的这篇文章主要介绍了C模板名称漂亮打印前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要打印缩进的模板名称以进行调试.
例如,我想缩写名称,而不是单行,而不是单行:
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;
}

猜你在找的C&C++相关文章