Есть ли в С++ немакро-способ печати имени переменной с ее значением. Вот способ макроса:
#define SHOW(a) std::cout << #a << ": " << (a) << std::endl
PS: я использую Linux и мне не нужно кроссплатформенное решение
Есть ли в С++ немакро-способ печати имени переменной с ее значением. Вот способ макроса:
#define SHOW(a) std::cout << #a << ": " << (a) << std::endl
PS: я использую Linux и мне не нужно кроссплатформенное решение
Вы можете использовать динамические символы, но тогда это будет работать только в разделяемых библиотеках или исполняемых файлах, скомпилированных с флагом -rdynamic. И он будет распознавать только глобальные переменные с динамической видимостью по умолчанию.
#include <dlfcn.h>
#include <iostream>
int NameMe = 42;
const char *GetName(const void *ptr)
{
Dl_info info;
if (dladdr(ptr, &info))
return info.dli_sname;
else
return NULL;
}
template<typename T>
void Dump(const T &t)
{
const char *name = GetName(&t);
if (name)
std::cout << name;
else
std::cout << "<unknown>";
std::cout << ": " << t << std::endl;
}
int main()
{
int NoName = 33;
Dump(NameMe);
Dump(NoName);
return 0;
}
$ g++ dump.cpp -ldl -rdynamic
$ ./a.out
NameMe: 42
<unknown>: 33
Нет, С++ не поддерживает отражение, и единственный способ сделать это (насколько мне известно) — макросы.
Ни за что.
Без макроса вы должны сделать это:
std::cout <<"a : " << a << std::endl;
Другого пути нет.
Если вы можете получить все свои классы от общего предка, вы можете предоставить виртуальную функцию, которая выполняет это. Я не пробовал этот шаблон, он может не работать - буду признателен за отзывы.
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">
{
};
*this
работать без определения operator<<
в классе. Я бы реализовал Show()
в базовом классе и заставил (через чистый абстрактный метод в базовом классе) подклассы определить operator<<
или какой-то метод ToString.
- person qid; 28.07.2011