0

これが事です、私はstd::mapこのようにいくつかの を持っています:

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

また、いくつかの番号もあり、それぞれが上記の 1 つのマップに関連しています。

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

私がやろうとしているのは、すべてのマップを1つの配列に入れてから、各数値のマップにアクセスすることは、次のようにその配列の要素にアクセスするようなものになるということです:

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 に答える