Простое отражение в C ++ без макросов: вывод имени переменной и ее значения - PullRequest
7 голосов
/ 27 июля 2011

Есть ли в C ++ немассовый способ печати имени переменной с ее значением.Вот макрос:

#define SHOW(a) std::cout << #a << ": " << (a) << std::endl

PS: я использую Linux и не нуждаюсь в кроссплатформенном решении

Ответы [ 4 ]

6 голосов
/ 27 июля 2011

Нет, C ++ не поддерживает рефлексию, и единственный способ сделать это (насколько я знаю) - использовать макросы.

3 голосов
/ 28 июля 2011

Вы можете использовать динамические символы, но тогда они будут работать только в общих библиотеках или исполняемых файлах, скомпилированных с флагом -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
0 голосов
/ 27 июля 2011

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

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">
{
};
0 голосов
/ 27 июля 2011

Ни в коем случае.

Без макроса нужно сделать следующее:

std::cout <<"a : " << a << std::endl; 

Другого пути нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...