Поскольку вы осуществляете поиск по различным свойствам одних и тех же типов, я бы сказал, что это редкий случай использования для указателей на элементы .Следующий код должен помочь очистить это:
struct client {
std::string ip_address = "";
int socket_id = 0;
bool blocking = false;
};
// search_vector accepts a pointer to member of type T, and a value of type T
template<typename T>
std::vector<client>::iterator search_vector(std::vector<client>& list, T client::*member, T value){
return std::find_if(list.begin(), list.end(), [value, member](const client& c){ return c.*member == value; });
}
Это то, как вы бы сейчас его использовали, без какой-либо дополнительной enums
или специальной логики.
auto it1 = search_vector(client_list, &client::socket_id, 321);
auto it2 = search_vector(client_list, &client::blocking, true);
auto it3 = search_vector(client_list, &client::ip_address, "192.168.0.85");
Это точно search_vector
функция, конечно, ограничена переменными-членами и тестами на точное равенство.Но было бы довольно просто расширить это с помощью указателей на функции-члены для таких функций, как get_ip_address()
.
Для большей общности, перегрузка с чем-то вроде std::function<bool(T)> condition
вместо T value
также может помочь вам сделать большеконкретные поиски, когда вы не хотите точного равенства.