Если вы можете получить все ваши классы от общего предка, вы можете предоставить виртуальную функцию, которая выполняет это. Я не пробовал этот шаблон, он может не работать - некоторые отзывы приветствуются.
struct Reflector
{
virtual void Show() = 0;
};
template<class a, char name[]>
struct ReflectorImpl : public Reflector
{
virtual void Show()
{
std::cout << name << ": " << *this << std::endl;
}
};
class MyClass: public ReflectorImpl<MyClass, "MyClass">
{
};