Functions
F.10
Если операция может быть повторно использована, дайте ей имя
Причина
Документация, читаемость, возможность повторного использования.
Пример
struct Rec {
string name;
string addr;
int id; // уникальный идентификатор
};
bool same(const Rec& a, const Rec& b)
{
return a.id == b.id;
}
vector<Rec*> find_id(const string& name); // найти все записи для "name"
auto x = find_if(vr.begin(), vr.end(),
[&](Rec& r) {
if (r.name.size() != n.size()) return false; // имя для сравнения находится в n
for (int i = 0; i < r.name.size(); ++i)
if (tolower(r.name[i]) != tolower(n[i])) return false;
return true;
}
);
Здесь скрывается полезная функция (сравнение строк без учёта регистра) — как это часто бывает, когда аргументы лямбды становятся большими.
bool compare_insensitive(const string& a, const string& b)
{
if (a.size() != b.size()) return false;
for (int i = 0; i < a.size(); ++i) if (tolower(a[i]) != tolower(b[i])) return false;
return true;
}
auto x = find_if(vr.begin(), vr.end(),
[&](Rec& r) { return compare_insensitive(r.name, n); }
);
Или (если хотите избежать неявного захвата n):
auto cmp_to_n = [&n](const string& a) { return compare_insensitive(a, n); };
auto x = find_if(vr.begin(), vr.end(),
[](const Rec& r) { return cmp_to_n(r.name); }
);
Примечание
Это относится к функциям, лямбдам и операторам.
Исключение
- Лямбды, логически используемые только локально, например в качестве аргумента
for_eachи подобных алгоритмов управления потоком. - Лямбды в качестве инициализаторов
Контроль
- (сложно) помечать похожие лямбды
- ???