Чтобы преобразовать тип (или другой идентификатор) в строку, вам нужен макрос, но макрос не может проверить, является ли его параметр допустимым типом. Для добавления проверки типов в макрос можно добавить функцию шаблона:
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 ’не было объявлено" , если такого класса нет.