2013-06-06 2 views
2

Есть ли макрос для возврата (в идеале, как const char* или действительно cont char *const) имя файла его параметра или некоторая информация о нем?Функция имени типа (макрос)

Это в время компиляции, а не во время выполнения, так TypeInfo C++ s не будет делать. В любом случае, я бегу с -fno-rtti.

+8

Нет, нет –

+0

Макропроцессор даже не знает, что вы пишете C, не говоря уже о типах. Кроме того, имена типов не имеют * стандартного строкового представления. –

+0

Вы все еще можете посмотреть [эту тему «Строковое представление типа»] (http://www.velocityreviews.com/forums/t742758-string-representation-of-a-type.html), который содержит обсуждение (со Скоттом Мейерсом! ^^) и некоторыми ссылками (особенно [эта реализация «Printtype»] (http://geometrica.saclay.inria.fr/team/Marc.Glisse/tmp/printtype.cpp)). (Источник: статья Скотта Майерса _Появление и исчезновение констант в C++ _) –

ответ

2

Нет.

У C++ 11 есть идентификатор __func__ внутри определений функций, который создает строковую переменную с именем функции. Большинство компиляторов C++ имеют вариации, чтобы иметь «украшенные» имена функций.

+1

ждать, ждать, что? – slaphappy

+0

GCC 4.7, по крайней мере, использует имена недекорированных функций, поэтому это не может использоваться для взлома решения. Жалость. –

-1

Вместо того чтобы писать

cout<<mysteryMacro(std::string<wchar>); 

вы могли бы написать

cout<<"std::string<wchar>"; 

Единственная цель я вижу, чтобы получить typeinformation внутри шаблона, например:

template<T> 
void printT() { 
    cout << "T is of type"<<mysteryMacro(T); 
} 

Поскольку в противном случае вы автоматически знать код.

Это может быть достигнуто с помощью специализированной специализации.

Отказ от ответственности: это было непроверено, и это всего лишь намек на то, что ДОЛЖНО работать. Я не считаю это хорошим решением. Я уверен, что вы можете преобразовать это, чтобы скорее возвращать строки, чем печатать. Немного больше информации о том, что вам нужно, это было бы здорово.

template<T> 
void printT() { 
    code that generates compile error, so you see that you have an undefined type 
} 

template<> 
void printT<string>() { 
    cout << "you have a <string>"; 
} 

Если вы хотели бы использовать шаблон для переменных, которые вы бы ВГА полагаться на автоматическое удержание параметров шаблона следующим образом:

template<> 
void printT<string>(T) { 
    cout << "you have a <string>"; 
} 

и использовать его как этот

int x; 
printT(x); 

Eventhough Я не знаю, почему, поскольку, как указано, если вы не находитесь в шаблоне, вы будете знать тип при написании кода и в шаблонах тип передается в параметрах шаблона и, следовательно, knwon (not как строка), и вы всегда можете написать printT<T>()

+1

Я думаю, что OP хочет 'int x; printf ("% s \ n", MYSTERYMACRO (x)); 'для печати' int'. –

+0

@KonradRudolph: turn 'void f () {cout <<" string "}' в 'char * f () {return" string ";}' не должно быть сложно, кроме того, в комментариях есть ссылка к [решению] (http://geometrica.saclay.inria.fr/team/Marc.Glisse/tmp/printtype.cpp), который является более сложным, но использует эту концепцию. Я бы взял комментарий от пользователя gx_ как anwnser. – ted

+0

@KonradRudolph: (извините время редактирования было). Что касается получения типа переменной переменной, вам придется полагаться на параметры автоматического вывода шаблонов. 'template func (T)' и использовать его с 'func (x)', где x определяется как 'int x;' – ted

Смежные вопросы