Использование std :: for_each для полиморфного метода в c ++ - PullRequest
3 голосов
/ 20 января 2009

При использовании std :: for_each,

class A;
vector<A*> VectorOfAPointers;

std::for_each(VectorOfAPointers.begin(), VectorOfAPointers.end(), std::mem_fun(&A::foo));

Если у нас есть классы, наследуемые от A и реализующие foo (), и мы держим вектор указателей на A, есть ли способ вызвать полиморфный вызов функции foo (), а не явно вызывать A :: foo ()? Примечание: я не могу использовать boost, только стандартный STL.

Спасибо, Gal

1 Ответ

11 голосов
/ 20 января 2009

Это на самом деле работает так.

#include <algorithm>
#include <iostream>
#include <functional>
#include <vector>

struct A {
    virtual void foo() {
        std::cout << "A::foo()" << std::endl;
    }
};
struct B: public A {
    virtual void foo() {
        std::cout << "B::foo()" << std::endl;
    }
};

int main()
{
    std::vector<A*> VectorOfAPointers;
    VectorOfAPointers.push_back(new B());
    std::for_each(VectorOfAPointers.begin(), VectorOfAPointers.end(), std::mem_fun(&A::foo));
    return 0;
}

печать

B::foo()

Так что он делает именно то, что вы хотите. Убедитесь, что virtual ключевые слова присутствуют, их легко забыть.

...