2010-06-16 37 views
1

是否可以獲取模板參數名稱的字符串版本?已過時的模板參數

這樣的事情,如果只有我們運行預處理:

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

編輯 複製。請看這裏 Stringifying template arguments

+0

可能重複的[字符串化模板參數(HTTP://小號tackoverflow.com/questions/1488186/stringifying-template-arguments) – sbi 2010-06-16 21:05:01

回答

1

不可以。最接近的可以是typeid(T).name()。然而,這個結果沒有說明,即使是一個返回所有類型的空字符串的實現都是符合的。儘管如此,爲了調試目的,這通常是足夠的。

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>