1

RTTI の回避に関するいくつかの質問を見ましたが、私の質問はもう少し具体的であるようです。次に例を示します。

struct Base {};

struct A : Base {};
struct B : Base {};
struct C : Base {};

std::vector<Base*> vec;

ベクトル内のすべての可能な (順序付けされていない) オブジェクトのペアで何かをしたい (ベクトルに 0 と 1、0 と 2、1 と 2 の 3 つの要素がある場合)。私が欲しいものの疑似コードは次のようなものです:

if e1 is A and e2 is A:
    behavior1(e1, e2)
elif e1 is A and e2 is B:
    behavior2(e1, e2)
elif ...

多くの人が RTTI は設計が悪いと言っていますが、ここで避けることはできますか? そして、これらすべてのif/elifを実行するよりも効率的な方法はありますか?

4

5 に答える 5

0

behaviour() が A、B、C オブジェクトの仮想関数を呼び出して、特定の作業を実行するようにします。

struct Base 
{
    virtual doSomething(){};
};

struct A : Base 
{
    virtual doSomething(){  };
};
struct B : Base 
{
    virtual doSomething(){};
};

std::vector<Base*> vec;

void performOperation(Base* a, Base* b)
{
   a->doSomething(a, b);
   b->doSomething(a, b);
}

int myFunction
{
    // ... code to select a pair of objects omitted
    performOperation(a, b);
}
于 2013-08-02T09:35:38.737 に答える
0

マップのキャッシュを使用できると思います:

map<string, func*>;

func*behavior(A,B)関数またはbehavior(A,C)またはを指すことができる関数ポインタですbehavior(B, C)

A と B のオブジェクトを作成する場合はinsert(make_pair(AB, behavior(A,B))B and CA と B のオブジェクトを使用する場合はマップから取得でき、B と C の場合も同様です。

于 2013-08-02T09:33:39.413 に答える