Этому нужна только работа в g ++.
Я хочу функцию
template<typename T> std::string magic();
таким образом, что:
Class Foo{}; magic<Foo>(); // returns "Foo";
Class Bar{}; magic<Bar>(); // returns "Bar";
Я не хочу, чтобы это было сделано через специализацию (т.е. имеющий необходимость определить волшебство для каждого типа. Я надеюсь вытянуть некоторую черную магию макроса/шаблона здесь. Кто-либо знает как?)
Спасибо!
Строковым оператором макросов может быть то, что вы ищете:
#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
-121--4571411- Для того, чтобы сделать свою вещь, возможно, придется получить доступ к недокументированным функциям и взломам, что, безусловно, сделает яблоко бешеным, и это может привести к отклонению вашего приложения.
Теперь решение заключается в другом трюке, который вы используете две кнопки и их изображения меняются при их нажатии. Держите кнопки ближе и изображения половины сегментированного управления, чтобы дать иллюзию сегментированного управления, и это все, что я могу предложить вам.
Надеюсь, это поможет.
Спасибо,
Мэдхуп
-121--896839- Попробуйте typeid (Foo) .name ()
для запуска. Разбирайте, как считаете нужным; будет зависеть от реализации (но просто получение строки назад является портативным).
Чтобы преобразовать тип (или другой идентификатор) в строку, вам нужен макрос, но макрос не может проверить, является ли его параметр допустимым типом. Чтобы добавить проверку типа, к макросу можно добавить шаблонную функцию:
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' не был объявлен» , если такого класса нет.
Возможно, вы ищете строковый оператор макроса:
#define MAGICCLASSNAME(str) std::string magic(#str)
class Foo{}; MAGICCLASSNAME(foo)
Я пришел к следующему:
#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.
В C ++ , вероятно, вы ищете шаблонную черную магию. В таком случае Современный дизайн C ++ будет вам полезен.