Re[2]: Автопрогресс и автопрерываемость в С++
От: GhostCoders Россия  
Дата: 21.03.18 08:13
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>А потом будет цикл который вызывается из деструктора, там надо будет запретить исключения, потом ещё с catch(...) бороться.

В деструкторе — да, исключения запретить, но репорт прогресса нужно оставить.
А с catch(...) нужно ли еще как-то бороться дополнительно?

AG>В общем авто-магии не получится. Все проблемы интерапшинов из boost::thread будут.

Не работал с boost.thread. А он, что, поддерживает прерываемость?

AG>Так, подозреваю, даже без расширения компилятора сделать можно такое:

AG>
AG>for(class: interruption_points_adapter(school.classes()))
AG>{
AG>...
AG>}
AG>

AG>адаптер завернёт it++ в проверку.
Да, можно. Но прогресс не только по циклам. А по линейным операторам типа:

void process_stundent(Student& student) auto_progress
{
    process_name(student.name);
    process_surname(student.surname);
    process_sex(student.sex);
}
// который превращается в
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();
}


Плагин с Clang (расширение) вычислит что в функции process_student() 3 линейных вызова других метода,
и поэтому вставит инициализацию progress_helper student_progress(3); с константным числом 3 (времени компиляции).
Вообще, интересно, возможно такое (вычислить число вызовов функций) в compile-time через шаблоны или еще как-то? Ну использовать макросы что-то в духе
void process_stundent(Student& student)
{
    PROGRESS_STEP(process_name(student.name));
    PROGRESS_STEP(process_surname(student.surname));
    PROGRESS_STEP(process_sex(student.sex));
}

не вариант.

То есть, я думаю что это нельзя сделать в compile-time при помощи одного С++. Только расширение, основанное на Clang писать?
Третий Рим должен пасть!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.