Слияние вектора + сопоставление версий функции с одной совместимой версией
Это две мои перегруженные функции для std::map
контейнер и для std::vector
контейнер с лямбда-выражением.
Кто-нибудь видит способ сделать это шаблон-функцией, которая может проверять лямбда-выражение для pair
тип (в моем случае второй из пары) и тип обычного диапазона (например, vector
, deque
, так далее).
bool isPlayerIn(vector<Player*> players, int id) {
vector<Player*>::iterator found = find_if(begin(players), end(players),
[id] (Player* player) {
return player->getId() == id;
});
return found != end(players);
}
bool isPlayerIn(map<int, Player*> players, int id) {
map<int, Player*>::iterator found = find_if(begin(players), end(players),
[id] (pair<int, Player*> found) {
return found.second->getId() == id;
});
return found != end(players);
}
1 ответ
Это может быть решено с помощью некоторого шаблона метапрограммирования, в частности что-то вроде Boost'sis_pair
, Идея состоит в том, чтобы "оттолкнуть" дифференцирование от алгоритма до функтора.
Обратите внимание, что для очень короткой функции того типа, который вы написали, вы можете не найти это улучшение; для более длинных функций, включающих более сложные алгоритмы, это устранит большую часть дублирования.
Итак, у вас будет два класса, например:
template<typename T, bool Pair>
matches_id :
std::unary_function<T, bool>
{
// Ctor taking id
// operator() deciding if t.second matches id
};
template<typename T>
matches_id<T, false> :
std::unary_function<T, bool>
{
// Ctor taking id
// operator() deciding if t itself matches id
};
В вашем коде вы бы использовали find_if
с объектом типа
matches_id<T, is_pair<T>::value>