Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is it possible to join two functors to one? #522

Open
denzor200 opened this issue Aug 24, 2023 · 1 comment
Open

Is it possible to join two functors to one? #522

denzor200 opened this issue Aug 24, 2023 · 1 comment

Comments

@denzor200
Copy link

I'm finding something like this:

struct functor_1 {
    void operator() (std::string arg1, std::string arg2)
    {
        std::cout << arg1 << arg2 " from first functor" << std::endl
    }
};
struct functor_2 {
    void operator() (std::string arg1, std::string arg2)
    {
        std::cout << arg1 << arg2 " from second functor" << std::endl
    }
};
join(functor_1(), functor_2())("Hello, ", "World!"); // will print two lines:
// "Hello, World! from first functor"
// .. and
// "Hello, World! from second functor"

Is it possible to do using boost.hana?

@ricejasonf
Copy link
Collaborator

Yes, I would lean towards using lambdas, but sometimes capturing and forwarding arguments gets messy. Note that I made the inner lambda mutable to support non-const "functors" as you called them.

#include <boost/hana.hpp>
#include <iostream>

namespace hana = boost::hana;

struct functor_1 {
    void operator() (std::string arg1, std::string arg2)
    {
        std::cout << arg1 << arg2 << " from first functor" << '\n';
    }
};
struct functor_2 {
    void operator() (std::string arg1, std::string arg2)
    {
        std::cout << arg1 << arg2 << " from second functor" << '\n';
    }
};
auto join = [](auto&& ...fn) {
    auto fns = hana::make_tuple(static_cast<decltype(fn)>(fn)...);
    return [fns = std::move(fns)](auto&& ...args) mutable {
        return hana::for_each(
            fns, hana::reverse_partial(hana::apply, static_cast<decltype(args)>(args)...));
    };
#if 0 // Never go full demux.
    return hana::demux(hana::compose(hana::reverse_partial(hana::for_each, hana::apply), 
                                     hana::partial(hana::transform, std::move(fns))))
                                        (hana::capture);
#endif
};

int main() {
    join(functor_1(), functor_2())("Hello, ", "World!"); // will print two lines:
}

https://godbolt.org/z/azoYToM6a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants