Декларативное программирование с использованием ScopeGuard для SCOPE_FAIL

Я просматриваю слайды с выступления Андрея Александреску на https://github.com/CppCon/CppCon2015/blob/master/Presentations/Declarative%20Control%20Flow/Declarative%20Control%20Flow%20-%20Andrei%20Alexandrescu%20-%20CppCon%202015.pdf

Я пробую пример со слайда в Visual Studio 2017, но не получаю желаемого поведения.

void copyFileTransact(const bf::path &from, const bf::path &to)
{
bf::path temp = std::string("temp.deleteme");
SCOPE_FAIL{ ::remove(temp.string().c_str()); };
bf::copy_file(from, temp);
bf::rename(temp, to);
}

Определение макроса SCOPE_FAIL такое, как описано на слайдах.

class UncaughtExceptionCounter
{

public:

UncaughtExceptionCounter() : exceptionCount_(std::uncaught_exceptions()) {}

bool isNewUncaughtException() noexcept
{
return std::uncaught_exceptions() > exceptionCount_;
}

private:
int exceptionCount_;
};

template <typename FunctionType>
class ScopeGuardForNewException
{
public:

explicit ScopeGuardForNewException(const FunctionType & fun) :
function_(fun){}

explicit ScopeGuardForNewException(FunctionType && fun) :
function_(std::move(fun)) {}

~ScopeGuardForNewException()
{
if (exceptionCounter_.isNewUncaughtException())
function_();
}

private:
FunctionType function_;
UncaughtExceptionCounter exceptionCounter_;
};

enum class ScopeGuardOnFail {};

template <typename FunctionType>
ScopeGuardForNewException<typename std::decay<FunctionType>::type> operator
+ (ScopeGuardOnFail, FunctionType && fun)
{
return ScopeGuardForNewException<typename
std::decay<FunctionType>::type>
(std::forward<FunctionType>(fun));
}

#define CONCATENATE_IMPL(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_IMPL(s1, s2)

#ifdef __COUNTER__
#define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__)
#else
#define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
#endif

#define SCOPE_FAIL auto ANONYMOUS_VARIABLE(SCOPE_FAIL_STATE) =
::detail::ScopeGuardOnFail() + [&]()

Я ожидаю, что при указании недопустимого пути для copyFileTransact (), макрос SCOPE_FAIL должен быть выполнен, потому что bf :: copy_file не удалось.
Но число необработанных исключений по-прежнему равно 0 в определении ScopeGuard для SCOPE_FAIL.

Я не могу понять, как будет сгенерировано исключение, если bf :: copy_file завершится неудачно и будет считаться uncaught_exception?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]