Альтернатива typeid (T) .name () в c ++ 11? - PullRequest
4 голосов
/ 25 января 2012

Есть ли в c ++ 11 стандартный способ получения имени класса с помощью некоторого шаблона черной магии или динамически с помощью некоторой стандартной библиотечной функции?

Ответы [ 2 ]

7 голосов
/ 25 января 2012

Нет, но вы можете сделать одно:

template<class T> struct meta {
    static const std::string& get_name() {return T::class_name;}
};

и затем либо добавить статический член class_name в класс:

class MyClass {
public:
    static const std::string class_name("MyClass");
};

, либо специализовать мета:

template<> struct meta<int> { 
    static const std::string class_name("int");
    static const std::string& get_name() {return class_name;}
};

(вот макрос, чтобы сделать это проще)

#define specialize_meta(name) template<>struct meta<name>{static const std::string class_name(#name); static const std::string& get_name() {return class_name;} };
specialize_meta(double);

, а затем используйте мета-шаблон:

int main() {
   std::cout << meta<int>::get_name();
}

Если вы действительно хотитечтобы быть хитрым, вы также можете создать версию для функций, но они (очевидно) должны быть специализированными.

void foo(int) {} //function in question
template<class T, T& a> struct metafunc; //dont define generic.
template<decltype(foo), &foo> struct metafunc { //specialization
    static const std::string func_name("void foo(int)");
}
5 голосов
/ 25 января 2012

Однажды я нашел симпатичную печать прототипа функции весьма полезной:

В GCC PRETTY_FUNCTION содержит сигнатуру типа функции, а также ее голое имя.

Например, для шаблонного класса или функции вы получаете имена классов, развернутые в виде C-строки:

template<typename T>
class Vector {
  void foo(int i) {
    cout << __PRETTY_FUNCTION__ << endl;
  }
};

Это даст вам что-то вроде

void Vector<double>::foo(int)

Если вы создали экземпляр класса, например, двойники. Но это также дает вам определенные пользователем типы.

Не очень необычно, но у него есть свои применения.

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