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_>>>>>