在C++中,std::for_each
是一个算法,用于对容器中的每个元素执行特定操作。它不能直接用于多态方法,因为std::for_each
需要一个可调用对象作为操作,而多态方法需要一个指向基类的指针或引用,并且在运行时动态地绑定到派生类的实现。
为了在C++中实现多态方法并与std::for_each
一起使用,您可以使用C++11的lambda表达式和std::mem_fn
。std::mem_fn
是一个实用函数,用于生成可调用对象,该对象可以调用指定的成员函数。
例如,假设您有一个基类Shape
和两个派生类Circle
和Rectangle
,您希望使用std::for_each
对这些形状进行操作。首先,您需要定义一个虚拟方法area()
在基类Shape
中,并在派生类中重写该方法。然后,您可以使用std::mem_fn
和lambda表达式将该方法绑定到容器中的每个元素,并使用std::for_each
对它们进行操作。
#include<algorithm>
#include<functional>
#include<iostream>
#include<vector>
class Shape {
public:
virtual double area() const = 0;
};
class Circle : public Shape {
public:
Circle(double radius) : radius_(radius) {}
double area() const override { return 3.14159 * radius_ * radius_; }
private:
double radius_;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height) : width_(width), height_(height) {}
double area() const override { return width_ * height_; }
private:
double width_;
double height_;
};
int main() {
std::vector<Shape*> shapes = {new Circle(5), new Rectangle(3, 4)};
std::for_each(shapes.begin(), shapes.end(), [](Shape* shape) {
std::cout << "Area: "<< std::mem_fn(&Shape::area)(shape)<< std::endl;
});
return 0;
}
在这个例子中,std::mem_fn
用于生成一个可调用对象,该对象可以调用Shape::area()
方法。然后,lambda表达式将该方法绑定到容器中的每个元素,并使用std::for_each
对它们进行操作。
请注意,这个例子使用了原始指针和动态内存分配,这在实际项目中可能不是最佳实践。您可以使用智能指针和容器(如std::vector<std::unique_ptr<Shape>>
)来管理内存和资源。
领取专属 10元无门槛券
手把手带您无忧上云