【发布时间】:2019-03-23 16:18:35
【问题描述】:
所以我在 C++ 中实现了一个 TCP 服务器,并将所有用户存储在一个向量中。现在我需要一个更通用的函数来搜索多个不同的属性,我该如何改进这段代码?
struct client {
std::string ip_address = "";
int socket_id = 0;
bool blocking = false;
};
enum client_codes {
ip_address,
socket_id,
blocking,
};
template<typename T>
std::vector<client>::iterator search_vector(std::vector<client> &list, int type, T query) {
std::vector<std::function<bool(client)>> comparators;
comparators.push_back([&](client ob) {return ob.ip_address == std::to_string(query); });
comparators.push_back([&](client ob) {return ob.socket_id == query; });
comparators.push_back([&](client ob) {return ob.blocking == query; });
return std::find_if(std::begin(list), std::end(list), [&](client obj) {return comparators[type](obj); });
}
// Implementation
std::vector<client> client_list;
auto search1(search_vector(client_list, socket_id, 321));
auto search2(search_vector(client_list, blocking, true));
auto search3(search_vector(client_list, ip_address, "192.168.0.85"));
【问题讨论】:
-
要询问已经工作的代码的改进,您最好在SE Code Review 询问。
-
“搜索多个不同的属性”到底是什么意思?能举个例子吗?
-
保持简单。没有理由填充向量然后将索引传递到向量中直接传递适当的谓词。或者有简单的(可能是内联的)函数,比如
FindBySocketId。这样,您遵循 DRY 原则,并本地化了解数据保存方式的内部细节的代码,如果在某些时候需要改进代码,这有助于维护。
标签: c++ c++11 search lambda stdvector