decorate

Description

The decorate function adaptor helps create simple function decorators.

A function adaptor takes a function and returns a new functions whereas a decorator takes some parameters and returns a function adaptor. The decorate function adaptor will return a decorator that returns a function adaptor. Eventually, it will invoke the function with the user- provided parameter and function.

Synopsis

template<class F>
constexpr decorate_adaptor<F> decorate(F f);

Semantics

assert(decorate(f)(x)(g)(xs...) == f(x, g, xs...));

Requirements

F must be:

Example

#include <boost/hof.hpp>
#include <cassert>
#include <iostream>
#include <string>
using namespace boost::hof;

struct logger_f
{
    template<class F, class... Ts>
    auto operator()(const std::string& message, F&& f, Ts&&... xs) const 
        -> decltype(f(std::forward<Ts>(xs)...))
    {
        // Message to print out when the function is called
        std::cout << message << std::endl;
        // Call the function
        return f(std::forward<Ts>(xs)...);
    }
};
// The logger decorator
BOOST_HOF_STATIC_FUNCTION(logger) = boost::hof::decorate(logger_f());
    
struct sum_f
{
    template<class T, class U>
    T operator()(T x, U y) const
    {
        return x+y;
    }
};
    
BOOST_HOF_STATIC_FUNCTION(sum) = sum_f();
int main() {
    // Use the logger decorator to print "Calling sum" when the function is called
    assert(3 == logger("Calling sum")(sum)(1, 2));
}