是否可以获得模板参数名称的字符串化版本?
像这样,如果我们只运行预处理器:
template <typename T>
struct Named{
const char* name(){ return "Named<" #T ">"; }
};
编辑 重复。请参阅此处 字符串化模板参数
是否可以获得模板参数名称的字符串化版本?
像这样,如果我们只运行预处理器:
template <typename T>
struct Named{
const char* name(){ return "Named<" #T ">"; }
};
编辑 重复。请参阅此处 字符串化模板参数
不,您可以拥有的最接近的东西是typeid(T).name()
. 但是,其结果是未指定的,即使是为所有类型返回空字符串的实现也是符合要求的。但是,出于调试目的,它通常就足够了。
您是否按照Stringifying template argumentstypeid()
中的建议尝试过?
并非没有痛苦。我最接近的解决方案:
template <typename T>
struct Named{
const char* name();
};
#define DEFINE_NAMED(T) template<> const char* Named<T>::name(){ return #T ; };
DEFINE_NAMED(SomeNameSpace::SomeClass)
当然,这是邪恶的......到目前为止,您可以使用gccxml
andxsltproc
自动查找 unimplemented Named<T>::name()
,创建一些辅助文件,编译它,最后链接它:
gccxml test.cpp -fxml=test.xml
xsltproc -o Named.cpp Named.xslt test.xml
g++ Named.cpp test.cpp -o test.bin
一些提议 Named.xslt 文件(如果工作不知道):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" indent="yes" encoding="utf-8" />
<xsl:template match="Method" >
<xsl:text>template<> const char* </xsl:text>
<xsl:value-of select="@demangled" />
<xsl:text> { return "</xsl:text>
<xsl:value-of select="substring(@demangled,7,string-length(@demangled)-15)" />
<xsl:text>"; };
</xsl:text>
</xsl:template>
<xsl:template match="/">
<xsl:text>#include "Named.h"
</xsl:text>
<xsl:apply-templates select="/GCC_XML/Method[matches(@demangled,'^Named.*::name()$') and @extern = '1' ]" />
</xsl:template>
</xsl:stylesheet>