Как получить шаблонное имя типа в виде строки? - PullRequest
1 голос
/ 23 декабря 2010

Следующий код выводит строку «T», а не фактическое имя типа, когда вызывается шаблонная функция. Есть ли способ получить настоящее имя типа без добавления чего-либо к шаблонируемым типам?

#define stringify(a) #a
#define tostring(a) stringify(a)

template <typename T>
void function_foo(T a, T b)
{
    cout << tostring(T) << endl;
    ...
}

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

Шаблоны не работают так. В вашем шаблоне T указывается тип, а не последовательность токенов:

typedef int lolztype;
typedef int lulztype;

function_foo<lolztype>(0, 0);
function_foo<lulztype>(0, 0); // calls the *same* template

Нет способа получить lolztype или lulztype соответственно. Что вы можете попробовать, так это использовать typeid(T).name(), но это не очень полезно, потому что не требуется, чтобы он был удобочитаемым для человека, и даже не требуется, чтобы он отличался для каждого типа.

Вы можете попробовать использовать файл Георди type_strings.hpp, который может распечатать читаемую человеком строку при компиляции с GCC.

1 голос
/ 23 декабря 2010

Есть оператор typeid. Но обратите внимание, что строка name() определяется реализацией. В частности, это часто включает в себя искажение имени. Некоторые реализации также предоставляют другой публичный метод для получения «более красивой» строки; проверьте заголовок <typeinfo>.

#include <typeinfo>
template <typename T>
void function_foo(T a, T b)
{
    std::cout << typeid(a).name() << std::endl;
    // ...
}
1 голос
/ 23 декабря 2010

использование:

#include <typeinfo>

template <typename T>
void function_foo(T a, T b)
{
    cout << typeid(a).name() << endl;
    ...
}

то, что возвращает typeid (). Name (), зависит от формы листа, но строка может представлять ваш тип.

0 голосов
/ 23 декабря 2010

Ваш единственный выбор - определить это отражение самостоятельно, возможно, через интерфейс, который возвращает строковое представление его конкретного типа.

struct my_type : public reflects {
    my_type();
    static const std::string& type_name = "my_type";
};
...