Навеяно моим постом —
http://rsdn.org/forum/cpp.applied/7053719.1Автор: GhostCoders
Дата: 13.02.18
Суть в том, что необходимо внутрь каждого "долгого" метода вставлять объявление progress_helper класса, например так:
void process_class(Class& class_)
{
progress_helper class_progress(school.get_student_count());
for(student: class_)
{
process_student(student);
class_progress.step();
}
}
progress_helper осуществляет репорт текущего прогресса в % при помощи колбэка, а также проверяет значение из колбэка,
надо ли прервать выполнение функции или нет. Если надо, то выбрасывает некое специальное исключение.
Вручную такие методы писать утомительно.
Я вот думаю, что если сделать на базе clang свое расширение компилятора, которые
дя заданных методов автоматически вставляло нужные объявления progress_helper?
Естественно, такие методы становятся бросающими исключениями.
Код:
void process_school(School& school) auto_progress
{
for(class: school.classes())
{
process_class(class);
}
}
void process_class(Class& class_) auto_progress
{
for(student: class_)
{
process_student(student);
}
}
void process_stundent(Student& student) auto_progress
{
process_name(student.name);
process_surname(student.surname);
process_sex(student.sex);
}
превращается в
void process_school(School& school)
{
progress_helper school_progress(school.get_class_count());
for(class: school.classes())
{
process_class(class);
school_progress.step();
}
}
void process_class(Class& class_)
{
progress_helper class_progress(school.get_student_count());
for(student: class_)
{
process_student(student);
class_progress.step();
}
}
void process_stundent(Student& student)
{
progress_helper student_progress(3);
process_name(student.name);
student_progress.step();
process_surname(student.surname);
student_progress.step();
process_sex(student.sex);
student_progress.step();
}
Что скажите?