テンプレート引数名の文字列化されたバージョンを取得することは可能ですか?
プリプロセッサを実行している場合のみ、次のようになります。
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()
。ただし、これの結果は指定されておらず、すべてのタイプに対して空の文字列を返す実装でさえ適合します。ただし、デバッグの目的では、多くの場合それで十分です。
テンプレート引数typeid()
の文字列化で提案されているように試しましたか?
痛みがないわけではありません。私の最も近い解決策:
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
いくつかの提案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<> 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>