Автопрогресс и автопрерываемость в С++
От: GhostCoders Россия  
Дата: 21.03.18 05:34
Оценка:
Навеяно моим постом — 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();
}


Что скажите?
Третий Рим должен пасть!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.