Я знаю, что дублирование кода обычно рассматривается как «плохое», однако в этом случае я, вероятно, НЕ использовал бы проверку во время выполнения, чтобы определить, передал ли я аргумент ... всякий раз, когда проверка может быть выполнена во время компиляции...
template<typename Func, typename Func2>
void ForEachField(Func normalHandler, Func2 arrayHandler, bool skipUnknowns = true)
{
for(int i = 0; i < mFields.size(); ++i)
{
Field *f = mFields[i];
if(skipUnknowns && f->IsUnknown()) { continue; }
if(f->GetCount() == 1) { normalHandler(f); }
else { arrayHandler(f); }
}
}
template<typename Func>
void ForEachField(Func normalHandler, bool skipUnknowns = true)
{
for(int i = 0; i < mFields.size(); ++i)
{
Field *f = mFields[i];
if(skipUnknowns && f->IsUnknown()) { continue; }
if(f->GetCount() == 1) { normalHandler(f); }
}
}
Помните, что вы можете прекрасно перегружать шаблоны функций, как обычно.
Это, в свою очередь, решит две проблемы:
- Второй параметр теперьнеобязательный (для любых целей)
- Больше не нужно применять
operator!
к лямбде (что не работает)