1

テンプレート引数名の文字列化されたバージョンを取得することは可能ですか?

プリプロセッサを実行している場合のみ、次のようになります。

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

複製を編集します。テンプレート引数の文字列化はこちらをご覧ください

4

3 に答える 3

1

いいえ。あなたが持つことができる最も近いものはですtypeid(T).name()。ただし、これの結果は指定されておらず、すべてのタイプに対して空の文字列を返す実装でさえ適合します。ただし、デバッグの目的では、多くの場合それで十分です。

于 2010-06-16T20:43:15.453 に答える
1

テンプレート引数typeid()の文字列化で提案されているように試しましたか?

于 2010-06-16T20:43:29.260 に答える
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>
于 2010-06-16T21:14:31.997 に答える