0

事情是这样的,我有几个std::maps,像这样:

std::map<int, std::set> map_1;
std::map<int, std::string> map_2;
std::map<int, long> map_3;
...

还有几个数字,每个数字都与上面列出的一张地图有关,比如

1 -> map_2
2 -> map_1
3 -> map_3
...

我要做的是,将所有地图放入一个数组中,然后访问每个数字的地图就像访问该数组的元素一样,如下所示:

arr = [map_2, map_1, map_3];
// let x be a number
map_x = arr[x];
do_something(map_x)

这样,我就可以不用写字了switch...case,对吧?

但是我可以把它们放在一起吗?如何?

4

2 回答 2

1

做这样的事情的正确方法是使用类。为特定类型的地图创建基类map和模板化子类。map*然后你可以创建一个元素数组。

于 2012-11-06T09:07:14.820 回答
0

另一个解决方案是使用boost::variant

将所有地图类型放入变量 ( boost::variant<std::map<int, std::set>, std::map<int, std::string>, std::map<int, long>>),然后像 (do_something应该已经重载了,对吧?):

class do_something_visitor
    : public boost::static_visitor<>
{
public:
    template <typename T>
    void operator()(T &map) const
    {
        do_something(map);
    }
};

boost::apply_visitor然后对变体数组中的项目应用访问 ( )。

于 2012-11-06T12:23:16.443 回答