我想使用一个同时指向
map<int,order>
和 map<int,order,greater<>>
的指针。
在下面的代码中,指针将根据标志指向某人。但代码无法编译成功。
这样做的原因是,我需要更新基于升序或降序的地图。除了迭代顺序外,所有更新操作都是相同的。更新操作是累加的。
那么,如何做到这一点?
using namespace std;
struct order {
int qty;
int sum;
};
void updateOpr(map<int, order >* pmap) {
order* pre = nullptr;
for (auto& [key, value] : *pmap) {
if (pre == nullptr) {
value.sum = value.qty;
}
else {
//todo some thing
value.sum = pre->sum + value.qty;
}
pre = &value;;
}
}
int main() {
map<int, order, greater<>> imap1;
map<int, order > imap2;
map<int, order >* pmap = nullptr;
bool flag = true;
if (flag) {
pmap = &imap1;
}
else {
pmap = &imap2;
}
int key = 10;
if (pmap->contains(key)) {
//todo some thing;
}
updateOpr(pmap);
}
类型是不同的并且没有共同的基类,所以你不能这样做。
当事物看起来相似但不相关时,模板对于这种情况非常有用。
将使用映射的代码移至函数模板,然后根据需要创建不同的映射并将其传递给函数。
类似这样的:
template<typename Map>
void do_the_work(Map& m)
{
// Work with m
}
int main() {
bool flag = true;
if (flag) {
map<int, int, greater<>> imap;
do_the_work(imap);
}
else {
map<int, int> imap;
do_the_work(imap);
}
}
我必须说,我不明白为什么评论者认为变体是唯一的选择。通过将地图更改为相同类型可以很容易地完成:
#include <functional>
#include <iostream>
#include <map>
int main() {
using CompareType = std::function<bool(int, int)>;
using MapType = std::map<int, int, CompareType>;
MapType mapAscending{std::less<int>{}};
MapType mapDescending{std::greater<int>{}};
MapType* mapPtr = nullptr;
bool shouldBeDescending;
std::cin >> shouldBeDescending;
if (shouldBeDescending) {
mapPtr = &mapDescending;
} else {
mapPtr = &mapAscending;
}
}