代码之家  ›  专栏  ›  技术社区  ›  pythonic metaphor

字符串化模板参数

  •  1
  • pythonic metaphor  · 技术社区  · 16 年前

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

    像这样,如果我们只是在运行预处理器:

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

    编辑 复制品。看到这里 Stringifying template arguments

    3 回复  |  直到 16 年前
        1
  •  1
  •   sbi    16 年前

    不,你能拥有的最接近的东西是 typeid(T).name() . 但是,结果是未指定的,即使是为所有类型返回空字符串的实现也是一致的。不过,为了调试的目的,这通常是足够的。

        2
  •  1
  •   Community Mohan Dere    9 年前

    你试过了吗? typeid() 如建议 Stringifying template arguments ?

        3
  •  1
  •   Arpegius    16 年前

    不是没有痛苦。我最接近的解决方案:

    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 xsltproc 自动查找未实现的 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
    

    一些名为.xslt的建议文件(duno if work):

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