Я надеюсь, что предмет отражает то, что я хочу спросить здесь ... Я приложил все усилия.
Мы должны установить определенные переменные на основе нескольких условий во время выполнения.Мы всегда делали заявления if..else, но я считаю их слишком громоздкими, особенно если учесть, что может быть несколько условий.Я попытался разработать что-то, используя возможности c ++ 11/17, и придумал следующее.
Итак, мой вопрос касается: производительности и читабельности, вы бы предпочли использовать следующее?
template <typename DST, typename... Ts>
void SetValue(DST& dst, Ts&&... ts)
{
CheckAndSetVal(dst, std::forward<Ts>(ts)...);
}
template <typename DST>
void CheckAndSetVal(DST&) {}
template <typename DST, typename T1, typename T2, typename... Ts>
std::enable_if_t<std::is_same_v<DST, T2> > CheckAndSetVal(DST& dst, T1&& cond, T2&& val, Ts&&... ts)
{
if (cond())
dst = val; // Assign the value here ...
else
CheckAndSetVal(dst, std::forward<Ts>(ts)...);
}
template <typename DST, typename T1, typename T2, typename... Ts>
std::enable_if_t<!std::is_same_v<DST, T2> > CheckAndSetVal(DST& dst, T1&& cond, T2&& val, Ts&&... ts)
{
if (cond())
dst = val(); // Assign the value using this functor ..
else
CheckAndSetVal(dst, std::forward<Ts>(ts)...);
}
int i;
//
// In practive though the conditions are not as trivial as they look here.
//
SetValue(i, []() { return false; }, 444
, []() { return false; }, 999
, []() { return true; }, []() { return 222; });