2

演算子として使用される5つのクラスがあります:

TurnOn , TurnOff , PushBox , Exit , Enter

そして、タイプごとに、そのタイプの説明を保持する文字列があります。

例えば ​​:

class Places {

enum Type { Room1 ,Room2 ,Room3 ,Room4 };


// more stuff

};
TurnOn turnOn(Places::Room1);
string turnOnString = "TurnOn(Room1)" ;

情報を地図に保存したいので、オペレーターごとに5つの地図があります。

map <string , TurnOn > opeatorTurnOn;
map <string , TurnOff > opeatorTurnOff ;
map <string , PushBox > opeatorTPushBox ;
map <string , Exit > opeatorExit ;
map <string , Enter > opeatorEnter ;

しかし今、私は同じ概念を持つ5つのマップを持っています:その演算子を持つ文字列。

同じ概念の5つのマップを保持する必要がないように、演算子を1つのマップに格納するにはどうすればよいですか?

4

4 に答える 4

3

オペレータークラスがどのように実装されているかによって異なりますが(情報はほとんどありません)、次のような呼び出し可能オブジェクトのマップを作成します。

#include <iostream>
#include <functional>
#include <map>

struct op1
{
    void operator()(int i) { std::cout << "op1::operator() " << i << "\n"; }
};

struct op2
{
    void operator()(int i) { std::cout << "op2::operator() " << i << "\n"; }
};

int main()
{
    std::map<std::string, std::function<void(int)>> ops;
    ops["1"] = op1{};
    ops["2"] = op2{};
    ops["1"](42);
    ops["2"](42);
}

オーバーロードを使用しない場合は、常にopsをラムダでラップすることもできますoperator()

于 2012-12-14T18:10:25.377 に答える
2

それらすべてを1つの基本クラスから継承し、基本へのポインターを格納し、ポリモーフィズムを使用します。

于 2012-12-14T17:55:08.870 に答える
1

異種データ型をマップ(またはその他のSTLコンテナー)に格納することはできません。

最も簡単な修正は、それらすべてを1つの基本クラスからサブクラス化し、基本クラスをマップに格納することです。

編集:私はポリモーフィズムを避けたいという願望に気づいていませんでした(しかし、私は本当に理由を理解していません)。いずれにせよ、boost::anyまたはboost::variantが役立つかもしれないと思います。それらすべてをboost::anyとして保存できます。 http://www.boost.org/doc/libs/1_52_0/doc/html/any.html

于 2012-12-14T17:58:13.537 に答える
0

boost::variant通常、そのようなものに使用されます。

于 2012-12-14T18:00:31.810 に答える