The problem is the following, in C++14:
FV&& valid_f, FI&& invalid_f, and argu
Take:
template struct rank : rank {};
template <> struct rank<0> {};
and then:
template
auto apply_on_validity_impl(rank<2>, FV&& valid_f, FI&& invalid_f, Args&&... args)
-> decltype(std::forward(valid_f)(std::forward(args)...), void())
{
std::forward(valid_f)(std::forward(args)...);
}
template
auto apply_on_validity_impl(rank<1>, FV&& valid_f, FI&& invalid_f, Args&&... args)
-> decltype(std::forward(invalid_f)(std::forward(args)...), void())
{
std::forward(invalid_f)(std::forward(args)...);
}
template
void apply_on_validity_impl(rank<0>, FV&& valid_f, FI&& invalid_f, Args&&... args)
{
}
template
void apply_on_validity(FV&& valid_f, FI&& invalid_f, Args&&... args)
{
return apply_on_validity_impl(rank<2>{}, std::forward(valid_f), std::forward(invalid_f), std::forward(args)...);
}
DEMO