Слияние вектора + сопоставление версий функции с одной совместимой версией

Это две мои перегруженные функции для 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>
Другие вопросы по тегам