动态筛选对象列表c++
Dynamically filtering a list of objects c++
如果我有一个类,比如:
class Car {
string name;
int age;
string manufacturer;
}
我显示了一个汽车列表,其中有一个过滤器下拉列表,包含名称、年龄和制造商。如何比较汽车上的各个属性?
我可以使用switch语句,但是如果有许多字段,这将变得难以管理。
在JS或Objective-C(使用KVC)中,您可以动态访问对象的属性,因此这很容易。
具体来说,我想问C++中访问变量或成员函数的等效模式是什么,因为它是由用户在运行时提供的,所以在编译时无法知道。
通常使用std::map<>
来存储属性,而不是单个数据成员。
这还有一个额外的优点,即允许在运行时创建属性,因此整个数据模型可以是动态的和数据驱动的。
该语言中没有等效的模式:与JS、Objective-C和其他具有重量级元数据的语言不同,C++对代码可用的运行时信息量有限,对完成任务没有任何帮助。
然而,这并不意味着没有办法构建自己的元数据。您可以制作一个函数,将字符串值与对象的字段进行比较,将这些函数映射到相应的字段,并使用映射中的函数按名称访问字段(好像):
// Field equality comparers
map<string,function<bool(Car&,string&)>> carFieldEq = {
{"name", [] (Car &c, string& cmp) { return c.name == cmp; }}
, {"age", [] (Car &c, string& cmp) { return to_string(c.age) == cmp; }}
, {"manufacturer", [] (Car &c, string& cmp) { return c.manufacturer == cmp; }}
};
// Field less-than comparers
map<string,function<bool(Car&,string&)>> carFieldLess = {
{"name", [] (Car &c, string& cmp) { return c.name < cmp; }}
, {"age", [] (Car &c, string& cmp) { return c.age < std::stoi(cmp); }}
, {"manufacturer", [] (Car &c, string& cmp) { return c.manufacturer < cmp; }}
};
您可以按如下方式使用这些地图:
auto cars = vector<Car> {
{"Impala", 10, "Chevrolet"}
, {"Focus", 3, "Ford"}
, {"Jetta", 3, "VW"}
};
string fieldNameEq, eqCmp;
cin >> fieldNameEq >> eqCmp;
cout << "==== Cars matching " << fieldNameEq << "==" << eqCmp << ":" << endl;
for (auto &c : cars) {
if (carFieldEq[fieldNameEq](c, eqCmp)) {
cout << c.name << " " << c.age << " " << c.manufacturer << endl;
}
}
string fieldNameLess, lessCmp;
cin >> fieldNameLess >> lessCmp;
cout << "==== Cars matching " << fieldNameLess << "<" << lessCmp << ":" << endl;
for (auto &c : cars) {
if (carFieldLess[fieldNameLess](c, lessCmp)) {
cout << c.name << " " << c.age << " " << c.manufacturer << endl;
}
}
演示。
请注意,carFieldEq
和carFieldLess
采用任意字符串,该字符串可能不一定与字段的实际名称匹配。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题