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++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...