LINUX.ORG.RU

История изменений

Исправление quiet_readonly, (текущая версия) :

int f2() try
{
	auto_ptr <RetRef> r1 = do_that();
	auto_ptr <RetRef> r2 = do_this();
	do_formatC();
	return 0;
} catch (int ret) {
	return ret;
}

Добавьте сюда код из RetRef, пожалуйста. Пока что я не вижу, чтобы у вас делалось undo_that или undo_this. Впрочем, для php-шников это типично.

А вот читаемый код, который работает, в отличие от нафантазированного RetRef, обладающего навыками телепата и умеющего вызвать undo_that или undo_this в зависимости от положения звёзд.

int f1()
{
    std::vector<Op> todo;
    todo.pushBack(Op(do_that, undo_that));
    todo.pushBack(Op(do_this, undo_this));
    todo.pushBack(Op(do_formatC));
    return performOperations(todo);
}

А вот код, аналогичный вашему убогому второму примеру

int f1()
{
    int code = 0;
    if (do_that(code) && do_this(code) && do_formatC(code))
        return 0;
    return code;
}

Исходная версия quiet_readonly, :

int f2() try
{
	auto_ptr <RetRef> r1 = do_that();
	auto_ptr <RetRef> r2 = do_this();
	do_formatC();
	return 0;
} catch (int ret) {
	return ret;
}

Добавьте сюда код из RetRef, пожалуйста. Пока что я не вижу, чтобы у вас делалось undo_that или undo_this. Впрочем, для php-шников это типично.

А вот читаемый код, который работает, в отличие от нафантазированного RetRef, обладающего навыками телепата и умеющего вызвать undo_that или undo_this в зависимости от положения звёзд.

int f1()
{
    std::vector<Op> todo;
    todo.pushBack(Op(do_that, undo_that));
    todo.pushBack(Op(do_this, undo_this));
    todo.pushBack(Op(do_formatC));
    return performOperations(todo);
}