字符串化的模板参数

时间:2010-06-16 20:39:44

标签: c++ templates stringification

是否可以获得模板参数名称的字符串化版本?

像这样,只要我们运行预处理器:

template <typename T>
struct Named{
    const char* name(){ return "Named<" #T ">"; }
};

修改 重复。看这里 Stringifying template arguments

3 个答案:

答案 0 :(得分:1)

没有。你最接近的是typeid(T).name()。但是,结果是未指定的,即使返回所有类型的空字符串的实现也是符合的。但是出于调试目的,通常就足够了。

答案 1 :(得分:1)

您是否按照Stringifying template arguments中的建议尝试了typeid()

答案 2 :(得分:1)

不是没有痛苦。我最亲密的解决方案:

template <typename T>
struct Named{
    const char* name();
};

#define DEFINE_NAMED(T) template<> const char* Named<T>::name(){ return #T ; };

DEFINE_NAMED(SomeNameSpace::SomeClass)

当然,这是邪恶的...... 到目前为止,您可以使用gccxmlxsltproc自动查找未实现的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文件(如果工作则为duno):

<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&lt;&gt; 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>