我想使用一个指向map
#include <map>
using namespace std;
int main() {
map<int, int, greater<>> imap1;
map<int, int > imap2;
map<int, int >* p2 = nullptr;
bool flag = true;
if (flag) {
p2 = &imap1;
}
else {
p2 = &imap2;
}
}
类型是不同的并且没有共同的基类,所以你不能这样做。
当事物看起来相似但不相关时,模板对于这种情况非常有用。
将使用映射的代码移至函数模板,然后根据需要创建不同的映射并将其传递给函数。
类似这样的:
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;
}
}