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

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

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

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

таким образом, что:

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

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

Спасибо!

5
задан skaffman 2 December 2010 в 14:36
поделиться

5 ответов

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

#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
-121--4571411-

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

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

Надеюсь, это поможет.

Спасибо,

Мэдхуп

-121--896839-

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

8
ответ дан 18 December 2019 в 07:08
поделиться

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

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' не был объявлен» , если такого класса нет.

10
ответ дан 18 December 2019 в 07:08
поделиться

Возможно, вы ищете строковый оператор макроса:

#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
4
ответ дан 18 December 2019 в 07:08
поделиться

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

#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++ и работает хорошо.

Также я взял это из этого ответа SO.

1
ответ дан 18 December 2019 в 07:08
поделиться

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

-1
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: