Если вы не против вставить код вручную, вы можете создать класс, который:
- записывает запись в метод в конструкторе
- предоставляет метод для сброса произвольных параметров
- предоставляет метод для записи статуса
- выход логов с записанным статусом в деструкторе
Использование будет выглядеть примерно так:
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 или какого-либо специального инструмента генерации кода.