如何在c++中使用指针指向map<int, int>和map<int,int,greater<>>

问题描述 投票:0回答:2

我想使用一个指向map和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;
    }
}
c++ pointers templates instantiation
2个回答
0
投票

类型是不同的并且没有共同的基类,所以你不能这样做。

当事物看起来相似但不相关时,模板对于这种情况非常有用。

将使用映射的代码移至函数模板,然后根据需要创建不同的映射并将其传递给函数。

类似这样的:

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);
    }
}

0
投票

我必须说,我不明白为什么评论者认为变体是唯一的选择。通过将地图更改为相同类型可以很容易地完成:

#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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.