Иван Андреевич (diente_de_lion) wrote,
Иван Андреевич
diente_de_lion

Задачка С++

Поперло меня тут что-то логгеры писать. Ну в смысле всякие примочки, чтобы легко было выводить во внешний файл или в консоль лог работы программы. Сначала (давно еще) я сделал такую приблуду:
int a = 5;
const char *b = "text";
log_info("info", a, b);

Выводит в лог:
info:
  a: 5
  b: "text"

Ну это просто и понятно. Пишем макрос, перебираем параметры, для каждого выводим имя и значение. Потом еще немножко допилил этот логгер стало можно писать так:
int a = 5;
const char *b = "text";
log_info("info", a as "A", b as "B");

На выходе - понятно что:
info:
  A: 5
  B: "text"

На всякий случай напоминаю: пишем на С++. Это уже не так тривиально было, но, вобщем, не сложно.

А вчера я резко заморочился выводом в лог сложных структур. Допустим есть у меня структура:
struct A
{
  int a, b;
};

И хочу я ее легко и просто выводить в лог. Чтобы был у меня такой код, например:
A a = { 1, 2 };
a.dump();
И писал бы он в лог сразу все поля структуры:
a: 1
b: 2

Естественно придется для этого в структуру внести какие-то изменения, у нас тут не C#, узнать какие поля были в структуре в рантайме нереально. Ну, допустим, пусть будет так:
struct A
{
  int a, b;
  log_dump(a, b);
};

Решение совершенно очевидное. Вобщем если бы на этом все заканчивалось, я бы и пост писать не стал. Но что если дело обстоит так:
struct A
{
  int a, b;
  log_dump(a, b);
};

struct B : public A
{
  int x, y;
  log_dump(x, y);
};

И создаю я в коде экземпляр класса-наследника и вызываю у него метод dump:
B b;
b.a = 1;
b.b = 2;
b.x = 3;
b.y = 4;
b.dump();

Очевидно, что я хочу раскрутить наследование назад так, чтобы родительский метод dump() тоже вызвался. И в логе хочу я видеть что-то такое:
a: 1
b: 2
x: 3
y: 4

Вопрос: можно ли это сделать? На обычном, неусправляемом С++. Очевидно, если в классе B внутри log_dump указать имя базового класса, то задача тривиальна. Ну а если нет? Если в исходной постановке? Возможно ли?

У кого какие варианты? Делитесь. Мне вчера чтобы решить эту задачу потребовалось приблизительно пять часов. Но решение есть. Работает и в визуальной студии и с gcc (т.е. никаких расширений типа микрософтского __super).

Или может быть я снова все усложняю? :-)
Tags: вопрос, программирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments