Выполнение определенного кода для каждого вызова метода в C++

У меня есть класс C++, который я хочу осмотреть. Так, я хотел бы ко всей печати методов их параметры и возврат, непосредственно перед уходом.

Последние несколько легкие взгляды. Если я действительно возвращаюсь () для всего, макроса

#define return(a) cout << (a) << endl; return (a)

сделал бы это (могло бы быть неправильным) если я padronize все возвраты к заключенному в скобки (или независимо от того, что это можно назвать). Если я хочу вынуть это, просто прокомментируйте определение.

Однако печать исходных данных кажется более трудной. Существует ли способ, которым я могу сделать это, с помощью структур C++ или со взломом workaroud?

7
задан AstroCB 31 August 2014 в 01:38
поделиться

6 ответов

Однако печать входных данных кажется более сложной. Могу ли я это сделать, используя структуры C ++ или обходное решение?

Нет.


Обновление: Я собираюсь потерять некоторую лаконичность в своем ответе, предположив, что вы, вероятно, можете достичь того, что вам нужно, применив Дизайн по контракту .

4
ответ дан 6 December 2019 в 11:47
поделиться

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

РЕДАКТИРОВАТЬ: Из вашего комментария выше (вам нужен вывод для статистики) я прихожу к выводу, что вам обязательно следует использовать шаблон декоратора. Он предназначен для такого рода вещей.

1
ответ дан 6 December 2019 в 11:47
поделиться

Похоже, вы хотите воспользуйтесь утилитой отладки для меня. Это позволит вам увидеть все нужные вам параметры.

2
ответ дан 6 December 2019 в 11:47
поделиться

Если вы не возражаете вставить код вручную, вы можете создать класс, который:

  1. регистрирует запись в методе в конструкторе
  2. предоставляет метод для сброса произвольных параметров
  3. предоставляет метод для статус записи
  4. журналы выход с записанным статусом в деструкторе

Использование будет выглядеть примерно так:

unsigned long long
factorial(unsigned long long n) {
    Inspector inspect("factorial", __FILE__, __LINE__);
    inspect.parameter("n", n);
    if (n < 2) {
        return inspect.result(1);
    }
    return inspect.result(n * fact(n-1));
}

Конечно, вы можете написать макросы для объявления инспектора и проверки параметров. Если вы работаете с компилятором, который поддерживает макросы списка переменных аргументов, то вы можете получить следующий результат:

unsigned long long
factorial(unsigned long long n) {
    INJECT_INSPECTOR(n);
    if (n < 2) {
        return INSPECT_RETURN(1);
    }
    return INSPECT_RETURN(n * fact(n-1));
}

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

2
ответ дан 6 December 2019 в 11:47
поделиться

На ум приходит несколько вариантов:

  • Использовать отладчик.
  • Используйте шаблон декоратора , как предлагал Space_C0wb0y. Однако это может быть много ручного набора, так как вам придется дублировать все методы в декорированном классе и добавлять ведение журнала самостоятельно. Возможно, вы могли бы автоматизировать создание объекта-декоратора, запустив doxygen в своем классе и затем проанализировав его вывод ...
  • Используйте аспектно-ориентированное программирование . (Ведение журнала, а именно то, что вы хотите делать, является распространенным применением АОП.) Википедия перечисляет несколько реализаций АОП для C ++: AspectC ++ , XWeaver ] и FeatureC ++ .
8
ответ дан 6 December 2019 в 11:47
поделиться

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

0
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: