2

int、float、または string のいずれかを保持するコンテナー オブジェクトがあります。同様の方法で処理されるこれらのコンテナーのキューがあります。現時点では、データ型ごとに個別のゲッターがあります。各コンテナー インスタンスが一度に 1 つのデータ型しか保持しないことを考えると、これは特に洗練されたものではありません。

class MyContainer
{
    MyContainer(float value);
    MyContainer(int value);
    MyContainer(string value);

    int getIntValue();
    float getFloatValue();
    string getStringValue();
}

void processContainer(MyContainer& container)
{
    // the following will not work, but is desired:
    process(container->getValue()); // compilation error
}

void process(int value) {}
void process(float value) {}
void process(string value) {}

上記のプロセス メソッドのパラメーターのオーバーロードを悪用する方法はありますか? たとえば、簡単に process(container->getValue()) を呼び出せるようになる方法はありますか?

4

6 に答える 6

2

Visitor別の方法は、パターンを使用することです。これにより、タイプに基づいて動的にディスパッチできます。

struct Float;
struct Integer;

struct ContainerVisitor {
    virtual void visit(Float& value) = 0;
    virtual void visit(Integer& value) = 0;
    // etc.
};

struct Container {
    virtual void accept(ContainerVisitor& visitor) = 0;
};

struct Integer : Container{
    virtual void accept(ContainerVisitor& visitor) {
        visitor.visit(*this);
    }
};

struct Float : Container{
    virtual void accept(ContainerVisitor& visitor) {
        visitor.visit(*this);
    }
};

次に、実行したいアクションが何であれ、から派生したクラスに入れますContainerVisitor

struct Processor : ContainerVisitor {
    virtual void visit(Float& value) {
        // equivalent of your process(float);
    }
    virtual void visit(Integer& value) {
        // equivalent of your process(int);
    }
};

次のように使用します。

int main() {
    Processor processor;

    Integer i;
    Float f;

    i.accept(processor);
    f.accept(processor);
}
于 2013-05-02T20:42:14.323 に答える