Транзакционно-подобный шаблон C++ для работы «все или ничего»

Предположим, у меня есть две функции DoTaskAи DoTaskB— обе способны генерировать TaskException— с соответствующими им «откатами». " функции UndoTaskAи UndoTaskB. Какой шаблон лучше всего использовать, чтобы либо оба были успешными, либо оба терпели неудачу?

Лучшее, что у меня есть на данный момент, это

bool is_task_a_done = false,
     is_task_b_done = false;

try {
    DoTaskA();
    is_task_a_done = true;

    DoTaskB();
    is_task_b_done = true;
} catch (TaskException &e) {
    // Before rethrowing, undo any partial work.
    if (is_task_b_done) {
        UndoTaskB();
    }
    if (is_task_a_done) {
        UndoTaskA();
    }
    throw;
}

Я знаю, что is_task_b_doneне нужен, но может быть полезен для демонстрации симметрии кода на случай, если позже мы добавим третью или четвертую задачу.

Не нравится этот код из-за вспомогательных логических переменных. Возможно, в новом C++11 есть что-то, о чем я не знаю, что может сделать это более красиво?

10
задан kirakun 11 June 2012 в 05:10
поделиться