wwa-scope-action 1.0.0
Scope guard utilities for managing exit actions in C++
wwa::utils::exit_action< ExitFunc > Class Template Reference

A scope guard that calls its exit function on destruction, when a scope is exited. More...

#include <scope_action.h>

+ Collaboration diagram for wwa::utils::exit_action< ExitFunc >:

Public Member Functions

 exit_action (exit_action &&other) noexcept(std::is_nothrow_move_constructible_v< ExitFunc >||std::is_nothrow_copy_constructible_v< ExitFunc >)
 Move constructor.
 
template<typename Func >
requires (detail::can_move_construct_from_noexcept<exit_action, ExitFunc, Func>)
 exit_action (Func &&fn) noexcept
 Constructs a new exit_action from an exit function of type Func.
 
template<typename Func >
requires (detail::can_construct_from<exit_action, ExitFunc, Func>)
 exit_action (Func &&fn) noexcept(std::is_nothrow_constructible_v< ExitFunc, Func >||std::is_nothrow_constructible_v< ExitFunc, Func & >)
 Constructs a new exit_action from an exit function of type Func.
 
 ~exit_action () noexcept
 Calls the exit function if m_is_armed is active, then destroys the object.
 
void release () noexcept
 Makes the exit_action object inactive.
 

Detailed Description

template<typename ExitFunc>
class wwa::utils::exit_action< ExitFunc >

A scope guard that calls its exit function on destruction, when a scope is exited.

An exit_action may be either active (i.e., it will calls its exit function on destruction), or inactive (it does nothing on destruction). An exit_action is active after construction from an exit function.

An exit_action becomes inactive by calling release() or a move constructor. An inactive exit_action may also be obtained by initializing with another inactive exit_action. Once an exit_action is inactive, it cannot become active again.

Usage example:

try {
auto guard = wwa::utils::exit_action{[&exit_status]() { exit_status = true; }};
maybe_throw();
}
catch (...) {
did_throw = true;
}
print_exit_status("exit_action", exit_status, did_throw);
Template Parameters
ExitFuncExit function type. Func is either a Destructible FunctionObject type, or an lvalue reference to a FunctionObject or function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_exit
https://github.com/microsoft/GSL/blob/main/docs/headers.md#user-content-H-util-final_action
Note
Constructing an exit_action of dynamic storage duration might lead to unexpected behavior.
If the exit function stored in an exit_action object refers to a local variable of the function where it is defined (e.g., as a lambda capturing the variable by reference), and that variable is used as a return operand in that function, that variable might have already been returned when the exit_action's destructor executes, calling the exit function. This can lead to surprising behavior.
Examples
scope_action.cpp.

Definition at line 88 of file scope_action.h.

Constructor & Destructor Documentation

◆ exit_action() [1/3]

template<typename ExitFunc >
template<typename Func >
requires (detail::can_construct_from<exit_action, ExitFunc, Func>)
wwa::utils::exit_action< ExitFunc >::exit_action ( Func && fn)
inlineexplicitnoexcept

Constructs a new exit_action from an exit function of type Func.

Initializes the exit function with a function or function object fn. The constructed exit_action is active. If Func is not an lvalue reference type, and std::is_nothrow_constructible_v<ExitFunc, Func> is true, the stored exit function is initialized with std::forward<Func>(fn); otherwise it is initialized with fn. If initialization of the stored exit function throws an exception, calls fn().

This overload participates in overload resolution only if:

  • std::is_same_v<std::remove_cvref_t<Func>, exit_action> is false, and
  • std::is_constructible_v<ExitFunc, Func> is true.
Template Parameters
FuncExit function type. Must be constructible from ExitFunc.
Parameters
fnExit function.
Exceptions
anythingAny exception thrown during the initialization of the stored exit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_exit/scope_exit

Definition at line 109 of file scope_action.h.

◆ exit_action() [2/3]

template<typename ExitFunc >
template<typename Func >
requires (detail::can_move_construct_from_noexcept<exit_action, ExitFunc, Func>)
wwa::utils::exit_action< ExitFunc >::exit_action ( Func && fn)
inlineexplicitnoexcept

Constructs a new exit_action from an exit function of type Func.

Initializes the exit function with a function or function object fn. The constructed exit_action is active. The stored exit function is initialized with std::forward<Func>(fn).

This overload participates in overload resolution only if:

  • std::is_same_v<std::remove_cvref_t<Func>, exit_action> is false, and
  • std::is_lvalue_reference_v<Func> is false, and
  • std::is_nothrow_constructible_v<ExitFunc, Func> is true.
Template Parameters
FuncExit function type. Must be constructible from ExitFunc.
Parameters
fnExit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_exit/scope_exit

Definition at line 142 of file scope_action.h.

◆ exit_action() [3/3]

template<typename ExitFunc >
wwa::utils::exit_action< ExitFunc >::exit_action ( exit_action< ExitFunc > && other)
inlinenoexcept

Move constructor.

Initializes the stored exit function with the one in other. The constructed exit_action is active if and only if other is active before the construction.

If std::is_nothrow_move_constructible_v<ExitFunc> is true, initializes stored exit function (denoted by exitfun) with std::forward<ExitFunc>(other.exitfun), otherwise initializes it with other.exitfun.

After successful move construction, other becomes inactive.

This overload participates in overload resolution only if:

  • std::is_nothrow_move_constructible_v<ExitFunc> is true, or
  • std::is_copy_constructible_v<ExitFunc> is true.
Parameters
otherexit_action to move from.
Exceptions
anythingAny exception thrown during the initialization of the stored exit function.
See also
https://en.cppreference.com/w/cpp/experimental/scope_exit/scope_exit

Definition at line 164 of file scope_action.h.

◆ ~exit_action()

template<typename ExitFunc >
wwa::utils::exit_action< ExitFunc >::~exit_action ( )
inlinenoexcept

Calls the exit function if m_is_armed is active, then destroys the object.

See also
https://en.cppreference.com/w/cpp/experimental/scope_exit/%7Escope_exit

Definition at line 192 of file scope_action.h.

Member Function Documentation

◆ release()

template<typename ExitFunc >
void wwa::utils::exit_action< ExitFunc >::release ( )
inlinenoexcept

Makes the exit_action object inactive.

Once an exit_action is inactive, it cannot become active again, and it will not call its exit function upon destruction.

See also
https://en.cppreference.com/w/cpp/experimental/scope_exit/release

Definition at line 207 of file scope_action.h.


The documentation for this class was generated from the following file: