C ++ шаблон черная магия - PullRequest
       4

C ++ шаблон черная магия

5 голосов
/ 16 февраля 2010

Это нужно только для работы в g ++.

Я хочу функцию

template<typename T> std::string magic();

такой, что:

Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";

Я не хочу, чтобы это делалось с помощью специализации (то есть, для определения магии для каждого типа. Я надеюсь вытащить сюда какую-нибудь черную магию макроса / шаблона. Кто-нибудь знает как?)

Спасибо!

Ответы [ 5 ]

10 голосов
/ 16 февраля 2010

Чтобы преобразовать тип (или другой идентификатор) в строку, вам нужен макрос, но макрос не может проверить, является ли его параметр допустимым типом. Для добавления проверки типов в макрос можно добавить функцию шаблона:

template<typename T>
std::string magic_impl(const char *name) { return name; }

#define more_magic(a) magic_impl<a>(#a)
#define magic(a) more_magic(a)

Здесь magic(int) выдает строку "int", а magic(Foo) выдает ошибку "" Foo ’не было объявлено" , если такого класса нет.

8 голосов
/ 16 февраля 2010

Попробуйте typeid(Foo).name() для начала. Разбирайте как считаете нужным; будет зависеть от реализации (но простое возвращение строки переносимо).

4 голосов
/ 16 февраля 2010

Строковый оператор в макросах может быть тем, что вы ищете:

#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
1 голос
/ 16 февраля 2010

Я придумал следующее:

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;
class Foo{}; 
class Bar{};

template<typename T> 
inline std::string magic(const T& obj)
{
 return typeid(obj).name();
}

int main()
{
 Foo a;
 cout << magic<Foo>(a); // returns "Foo";
}

Я проверил это с помощью g ++ и хорошо работает.

Также я получил это от этого ТАКОГО ответа.

0 голосов
/ 19 февраля 2010

В C ++ , вероятно, вы ищете шаблон черной магии. Если это так, Современный C ++ Design будет полезен.

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