Program Listing for File no_discard.hpp

Return to documentation for file (include/rsl/no_discard.hpp)

#pragma once

#include <utility>

namespace rsl {

template <typename Fn>
class NoDiscard {
    static_assert(std::is_invocable_v<Fn()>, "Fn must be invocable");
    Fn fn_;

   public:
    NoDiscard(Fn const& fn) : fn_(fn) {}
    template <typename... Ts>
    [[nodiscard]] constexpr auto operator()(Ts&&... args) const
        noexcept(noexcept(fn_(std::forward<Ts>(args)...))) {
        return fn_(std::forward<Ts>(args)...);
    }
};

}  // namespace rsl