Стрифицированный аргумент шаблона - PullRequest
1 голос
/ 17 июня 2010

Можно ли получить строковую версию имени аргумента шаблона?

Примерно так, если бы мы только запускали препроцессор:

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

Редактировать Дубликат. Посмотреть здесь Строковые аргументы шаблона

Ответы [ 3 ]

1 голос
/ 17 июня 2010

Вы пробовали typeid(), как предложено в Строковые аргументы шаблона ?

1 голос
/ 17 июня 2010

Не без боли.Мое ближайшее решение:

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&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>
1 голос
/ 17 июня 2010

Нет. Самое близкое, что вы можете иметь, это typeid(T).name(). Однако, результат этого не определен, даже реализация, которая вернула бы пустые строки для всех типов, была бы соответствующей. Однако для целей отладки этого часто достаточно.

...