У меня есть класс C++, который я хочу осмотреть. Так, я хотел бы ко всей печати методов их параметры и возврат, непосредственно перед уходом.
Последние несколько легкие взгляды. Если я действительно возвращаюсь () для всего, макроса
#define return(a) cout << (a) << endl; return (a)
сделал бы это (могло бы быть неправильным) если я padronize все возвраты к заключенному в скобки (или независимо от того, что это можно назвать). Если я хочу вынуть это, просто прокомментируйте определение.
Однако печать исходных данных кажется более трудной. Существует ли способ, которым я могу сделать это, с помощью структур C++ или со взломом workaroud?
Однако печать входных данных кажется более сложной. Могу ли я это сделать, используя структуры C ++ или обходное решение?
Нет.
Обновление: Я собираюсь потерять некоторую лаконичность в своем ответе, предположив, что вы, вероятно, можете достичь того, что вам нужно, применив Дизайн по контракту .
] Если все ваши методы виртуальные
, вы можете использовать шаблон декоратора , чтобы добиться этого очень элегантным способом.
РЕДАКТИРОВАТЬ: Из вашего комментария выше (вам нужен вывод для статистики) я прихожу к выводу, что вам обязательно следует использовать шаблон декоратора. Он предназначен для такого рода вещей.
Похоже, вы хотите воспользуйтесь утилитой отладки для меня. Это позволит вам увидеть все нужные вам параметры.
Если вы не возражаете вставить код вручную, вы можете создать класс, который:
Использование будет выглядеть примерно так:
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 или какой-нибудь специальный инструмент для генерации кода.
На ум приходит несколько вариантов:
Я бы просто использовал библиотеку журналирования (или несколько макросов) и вставлял вызовы ручного журналирования. Если у вашего класса нет чрезмерного количества методов, это, вероятно, быстрее, чем разработка и отладка более сложного решения.