В C++14
проблема заключается в следующем:
- Пусть две функции
FV&& valid_f
,FI&& invalid_f
и аргументыArgs&&... args
- Функция
apply_on_validity
должна применятьсяvalid_f
наargs
, если выражениеstd::forward<FV>(valid_f)(std::forward<Args>(args)...)
действительно - В противном случае, и если
std::forward<FV>(invalid_f)(std::forward<Args>(args)...)
является допустимым выражением,apply_on_validity
должен применитьinvalid_f
кargs
- В противном случае
apply_on_validity
ничего не должен делать
Я предполагаю, что код должен выглядеть примерно так:
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
}
Но я действительно не знаю, как это сделать. Любая идея?
Ссылка на обобщение здесь.