Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板名称漂亮打印_C++_Templates_Typeinfo - Fatal编程技术网

C++ C++;模板名称漂亮打印

C++ C++;模板名称漂亮打印,c++,templates,typeinfo,C++,Templates,Typeinfo,为了调试,我需要打印缩进的模板名称。 例如,我希望缩进名称,而不是单行,如下所示: boost::phoenix::actor< boost::phoenix::composite< boost::phoenix::less_eval, boost::fusion::vector< boost::phoenix::argument<0>, boost::phoenix::argument<1>

为了调试,我需要打印缩进的模板名称。 例如,我希望缩进名称,而不是单行,如下所示:

boost::phoenix::actor<
    boost::phoenix::composite<
      boost::phoenix::less_eval,
      boost::fusion::vector<
        boost::phoenix::argument<0>,
        boost::phoenix::argument<1>,
boost::phoenix::actor<
boost::phoenix::composite<
凤凰城:更少的评估,
boost::fusion::vector<
boost::phoenix::argument,
boost::phoenix::argument,
我开始自己写,但越来越复杂了。 是否存在现有的解决方案

如果没有,你能帮我完成我的实现吗? 如果是的话,我会把它寄出去

谢谢

这就是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_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void >, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_, boost::fusion::void_, boost::fusion::void_, 
boost::fusion::void_> > >
boost::phoenix::actor,//缩进搞砸了
24助推::聚变::无效,
25助推::聚变::无效,
26助推::聚变::无效,
27助推::聚变::无效,
28助推::聚变::无效,
29助推::聚变::无效,
30助推::聚变::无效,
31推进::融合::无效_
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;
}
std::string缩进(std::string str,const std::string&indent=”“){
std::string缩进=std::string(“\n”);
大小\u t标记=0;
while((token=str.find_first_of(“,”,token))!=std::string::npos){
开关(str[token]){
大小写“”:缩进.擦除(缩进.大小()-缩进.大小());
str.insert(标记、缩进);
}
标记+=缩进大小()+1;
const size\u t nw=str.find\u first\u not\u of(“,token);
if(nw!=std::string::npos){
str.erase(令牌,nw令牌);
}
}
返回str;
}

gf程序的小调整,主要是不拆分短模板

#ifndef PRETTY_NAME_HPP
#define PRETTY_NAME_HPP

#include <typeinfo>
#include <string>
#include <iostream>
#include <cxxabi.h>

#define TYPENAME(TYPE) typeid_name(typeid(TYPE).name())

std::string indent(std::string str, const std::string &indent = "  ") {
    std::string indent_ = std::string("\n");
    size_t token = 0;

    bool one_line = false;
    while ((token = str.find_first_of("<>,", token)) != std::string::npos) {
        size_t size = str.size();
        size_t close, open, comma;

        switch(str[token]) {
        case '<':
            close = str.find(">", token+1);
            open = str.find("<", token+1);
            comma = str.find(",", token+1);
            one_line = !(close > open) && !(comma < close);

            if (one_line) break;
            indent_.append(indent);

        case ',':
            str.insert(token + 1, indent_);
            break;

        case '>':
            if (!one_line) {
                indent_.erase(indent_.size() - indent.size());
                str.insert(token, indent_);
            }
            one_line = false;
        }

        token += 1 + str.size() - size;

        const size_t nw = str.find_first_not_of(" ", token);
        if(nw != std::string::npos) {
            str.erase(token, nw-token);
        }
    }

    return str;
}
std::string typeid_name(const char* name) {
// #ifdef HAVE_CXA_DEMANGLE
    size_t size;
    int status;
    char *buf = abi::__cxa_demangle(name, NULL, &size, &status);
    if (status  != 0) throw status;
    std::string string(buf);
    free(buf);
    return indent(string);
// #else
//     return name;
// #endif
}

#endif /* PRETTY_NAME_HPP */
\ifndef PRETTY\u NAME\u水电站
#定义水电站的名称
#包括
#包括
#包括
#包括
#定义TYPENAME(TYPE)typeid\u name(typeid(TYPE).name())
std::string缩进(std::string str,const std::string&indent=“”){
std::string缩进=std::string(“\n”);
大小\u t标记=0;
bool one_line=false;
while((token=str.find_first_of(“,”,token))!=std::string::npos){
size_t size=str.size();
大小\u t关闭、打开、逗号;
开关(str[token]){
案例“”:
如果(!一行){
缩进.擦除(缩进.大小()-缩进.大小());
str.insert(标记、缩进);
}
一行=假;
}
令牌+=1+str.size()-size;
const size\u t nw=str.find\u first\u not\u of(“,token);
if(nw!=std::string::npos){
str.erase(令牌,nw令牌);
}
}
返回str;
}
std::字符串类型ID_名称(常量字符*名称){
//#如果定义有"CXA"DEMANGLE
大小;
智力状态;
char*buf=abi::_cxa_demangle(名称、空值、大小和状态);
如果(状态!=0)抛出状态;
std::字符串(buf);
免费(buf);
返回缩进(字符串);
//#其他
//返回名称;
//#endif
}
#endif/*PRETTY\u NAME\u水电站*/

复制到剪贴板,然后

$ xclip -o | clang-format
例如,这将使OP的模板

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_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void>,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_> > >

您要打印的模板名称来自何处?是您自己创建的,还是正在解析预先存在的输入,或者。。。解决方案不仅取决于您试图输出的内容,还取决于此输出的输入来自何处。这篇文章与您下面的答案有何关联?看起来他正在试图打印堆栈跟踪。但是他希望模板类型看起来更好,所以他希望用包含额外间距的版本(包括换行符)来代替它们。我认为像
boost::fusion::void\uu
这样的
boost::mpl::na
实际上是填充物(由于缺少可变模板)并且在逻辑上不属于该类型,因此最好实际删除它们(您也会保留一些位置)。我可以稍微修改一下您的列表吗?如果您有一些小的改进,请将它们放在注释中。如果你有一个完全不同的版本,你可以把它放在另一个答案里@aaa
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_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void>,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_,
        boost::fusion::void_, boost::fusion::void_> > >
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_, boost::fusion::void_,
                boost::fusion::void_, boost::fusion::void_,
                boost::fusion::void_, boost::fusion::void, boost::fusion::void_,
                boost::fusion::void_, boost::fusion::void_,
                boost::fusion::void_, boost::fusion::void_,
                boost::fusion::void_, boost::fusion::void_,
                boost::fusion::void_>>>>>