Получение строкового представления параметра шаблона - PullRequest
2 голосов
/ 25 сентября 2011

Я хочу иметь возможность создать метод в шаблонном классе, который возвращает имя типа, замещенного в параметре шаблона.

например:

template <typename T>
class CPropertyValueT 
{
  std::string GetTypeName()
  {
    return #T;
  }
}

Это возможно при использовании макроса препроцессора с использованием #, я полагал, что с шаблонами должен быть способ.

Возможно ли это?

Ответы [ 2 ]

6 голосов
/ 25 сентября 2011

Вы можете использовать typeid(T).name(), хотя он вернет оформленное имя типа.

Если вы используете GCC, то вы можете использовать GCC API, объявленный в заголовке cxxabi.h, для разделения имен.

Вот пример ( source ):

#include <exception>
#include <iostream>
#include <cxxabi.h>

struct empty { };

template <typename T, int N>
  struct bar { };


int main()
{
  int     status;
  char   *realname;

  // exception classes not in <stdexcept>, thrown by the implementation
  // instead of the user
  std::bad_exception  e;
  realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
  std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
  free(realname);


  // typeid
  bar<empty,17>          u;
  const std::type_info  &ti = typeid(u);

  realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
  std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
  free(realname);

  return 0;
}

Выход:

  St13bad_exception       => std::bad_exception   : 0
  3barI5emptyLi17EE       => bar<empty, 17>       : 0

Еще одна интересная ссылка, которая описывает разборку в GCC и Microsoft VC ++:

0 голосов
/ 25 сентября 2011
#include <cstdlib>
#include <typeinfo>
#include <iostream>

using namespace std;

template <typename T>
class CPropertyValueT 
{
public:
  std::string GetTypeName()
  {
    return std::string(typeid(T).name());
  }
};

int main()
{
    CPropertyValueT<float> x;

    cout << x.GetTypeName();

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...