我的boost::variant
定义如下:
typedef boost::variant<Rectangle, Circle> Shape;
现在我想从Shape
:
Rectangle
指针
Rectangle *rectanglePointer = new Rectangle();
Shape *shapePointer = rectanglePointer;
但它不起作用。我在这里弄错了什么?
答案 0 :(得分:0)
简单。变种不会这样工作。
他们专门针对静态多态性。
您/可以/存储运行时多态引用(或指针),但您仍然需要使用boost::get<>
或访问者来提取实际值。
在您的情况下,Shape
显然不是Rectangle
的基类,这就是编译器将拒绝静态转换的原因(向上转换不适用于不相关的类型{{1} }和Rectangle
)。
变体的一个简单示例:
<强> Live On Coliru 强>
Shape
#include <boost/variant.hpp>
#include <iostream>
struct Circle {
friend std::ostream& operator<<(std::ostream& os, Circle) {
return os << "Circle";
}
};
struct Rectangle {
friend std::ostream& operator<<(std::ostream& os, Rectangle) {
return os << "Rectangle";
}
};
using Shape = boost::variant<Circle, Rectangle>;
int main() {
Shape shape = Rectangle();
std::cout << shape << "\n";
shape = Circle();
std::cout << shape << "\n";
}
实施<强> Live On Coliru 强>
area(Shape)
使用您可以在其他语言中使用的多态性:
<强> Live On Coliru 强>
#include <boost/variant.hpp>
#include <iostream>
struct Point { double x,y; };
struct Circle {
Point centre;
double radius;
friend std::ostream& operator<<(std::ostream& os, Circle) {
return os << "Circle";
}
};
struct Rectangle {
Point topleft, bottomright;
friend std::ostream& operator<<(std::ostream& os, Rectangle) {
return os << "Rectangle";
}
};
struct area_f : boost::static_visitor<double> {
double operator()(Rectangle const& r) const {
return std::abs(r.bottomright.x - r.topleft.x) *
std::abs(r.bottomright.y - r.topleft.y);
}
double operator()(Circle const& r) const {
return (r.radius*r.radius) * M_PI;
}
};
using Shape = boost::variant<Circle, Rectangle>;
double area(Shape const& s) {
return boost::apply_visitor(area_f(), s);
}
int main() {
Shape shape = Rectangle { { 1,1 }, { 5,5 } };
std::cout << shape << ": " << area(shape) << "\n";
shape = Circle { { 10, 10 }, 5 };
std::cout << shape << ": " << area(shape) << "\n";
}
答案 1 :(得分:0)
Shape是一个可以包含Rectangle或Circle的框。如果你有一个矩形并想把它放在一个盒子里,你需要一个实际的物理盒子。你不能只是声明这个地方有这样一个地方,这个地方就是矩形,现在是一个盒子,因为没有盒子。