This previous answer shows how to apply function based on the validity of a call: here. However, it applies to two functions. I was wondering if the concept could be general
Use boost::hana::overload_linearly:
hana::overload_linearly(f1, f2, f3)(a, b, c, d, e)
If none of the expressions are valid, it's a compile error, but it's easy to make it do nothing in that case:
hana::overload_linearly(f1, f2, f3, [](auto&&...) {})(a, b, c, d, e)
Alternatively, use boost::hof::first_of, which does the same thing