how to implement binders and decorators on c++ lik python?

#include <iostream>
#include <functional>

template <typename Func, typename... Args>
class Binder {
public:
    Binder(Func&& func, Args&&... args) : func(std::forward<Func>(func)), args(std::forward<Args>(args)...) {}

    template <typename... RestArgs>
    auto operator()(RestArgs&&... rest_args) {
        return std::invoke(func, args..., std::forward<RestArgs>(rest_args)...);
    }

private:
    Func func;
    std::tuple<Args...> args;
};

template <typename Func>
class Decorator {
public:
    Decorator(Func&& func) : func(std::forward<Func>(func)) {}

    template <typename... Args>
    auto operator()(Args&&... args) {
        return std::invoke(func, std::forward<Args>(args)...);
    }

private:
    Func func;
};

template <typename Func, typename... Args>
auto bind(Func&& func, Args&&... args) {
    return Binder<Func, Args...>(std::forward<Func>(func), std::forward<Args>(args)...);
}

template <typename Func>
auto decorate(Func&& func) {
    return Decorator<Func>(std::forward<Func>(func));
}

// Example Usage:
int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    auto bound_add = bind(add, 5);
    std::cout << "Bound add: " << bound_add(3) << std::endl;

    auto decorated_multiply = decorate(multiply);
    std::cout << "Decorated multiply: " << decorated_multiply(2, 4) << std::endl;

    auto bound_and_decorated = decorate(bind(add, 10));
    std::cout << "Bound and decorated add: " << bound_and_decorated(7) << std::endl;

    return 0;
}