Elija la función para aplicar en función de la validez de una expresión

El problema es el siguiente, enC++14:

Tengamos dos funcionesFV&& valid_f, FI&& invalid_fy argumentosArgs&&... argsLa funciónapply_on_validity debería aplicarvalid_f enargs si la expresiónstd::forward<FV>(valid_f)(std::forward<Args>(args)...) es válidaDe lo contrario y sistd::forward<FV>(invalid_f)(std::forward<Args>(args)...) es una expresión válidaapply_on_validity debería aplicarinvalid_f enargsDe otra maneraapply_on_validity no debería hacer nada

Supongo que el código debería verse así:

template <class FV, class FI, class... Args, /* Some template metaprog here */>
void apply_on_validity(FV&& valid_f, FI&& invalid_f, Args&&... args)
{
    // Apply valid_f by default
    std::forward<FV>(valid_f)(std::forward<Args>(args)...);
}

template <class FV, class FI, class... Args, /* Some template metaprog here */>
void apply_on_validity(FV&& valid_f, FI&& invalid_f, Args&&... args)
{
    // Apply invalid_f if valid_f does not work
    std::forward<FV>(invalid_f)(std::forward<Args>(args)...);
}

template <class FV, class FI, class... Args, /* Some template metaprog here */>
void apply_on_validity(FV&& valid_f, FI&& invalid_f, Args&&... args)
{
    // Do nothing when neither valid_f nor invalid_f work
}

Pero realmente no sé cómo hacer eso. ¿Alguna idea?

Enlace a la generalizaciónaquí.

Respuestas a la pregunta(3)

Su respuesta a la pregunta