boost variant:获取提供变体的泛型类的指针

时间:2015-02-05 16:57:52

标签: c++ boost

我的boost::variant定义如下:

typedef boost::variant<Rectangle, Circle> Shape;

现在我想从Shape

获得Rectangle指针
Rectangle *rectanglePointer = new Rectangle();
Shape *shapePointer = rectanglePointer;

但它不起作用。我在这里弄错了什么?

2 个答案:

答案 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的框。如果你有一个矩形并想把它放在一个盒子里,你需要一个实际的物理盒子。你不能只是声明这个地方有这样一个地方,这个地方就是矩形,现在是一个盒子,因为没有盒子。