【问题标题】:Stringified template argument字符串化模板参数
【发布时间】:2010-06-16 20:39:43
【问题描述】:

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

类似这样的东西,如果我们只运行预处理器:

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

编辑 复制。看这里 Stringifying template arguments

【问题讨论】:

标签: c++ templates stringification


【解决方案1】:

没有。您可以拥有的最接近的东西是typeid(T).name()。但是,其结果是未指定的,即使是为所有类型返回空字符串的实现也是符合要求的。但是,出于调试目的,它通常就足够了。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      并非没有痛苦。我最接近的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多