Здравствуйте, 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 писать?