1

いくつかの座標 (1,2) を持つ ShapeType の Point があり、オーバーロードされた演算子 () で apply_visitor を使用して座標 (3,4) を Point に追加したいので、Point は最終的に(4,6)。私の実装はどこで失敗していますか? 私の ShapeVisitor クラスは正しいと思いますが、「apply_visitor」は CLARK::Point のメンバーではありません。

コードは次のとおりです。

#include "Point_H.hpp"
#include "Shape_H.hpp"
#include "boost/variant.hpp"

typedef boost::variant<Point,Line,Circle> ShapeType;

ShapeType ShapeVariant(){...}

class ShapeVisitor : public boost::static_visitor<> 
{
private:
    double m_dx; // point x coord
    double m_dy; // point y coord

public:    
    ShapeVisitor(double m_dx, double m_dy);
    ~ShapeVisitor();

    // visit a point
    void operator () (Point& p) const
    {
        p.X(p.X() + m_dx);
        p.Y(p.Y() + m_dy);
    }
};

int main()
{   
    using boost::variant;

    ShapeType myShape = ShapeVariant(); // select a Point shape

    Point myPoint(1,2);

    boost::get<Point>(myShape) = myPoint; // assign the point to myShape

    boost::apply_visitor(ShapeVisitor(3,4), myPoint); // trying to add (3,4) to myShape

    cout << myPoint << endl;

    return 0;
}

ありがとう!

4

1 に答える 1

3
  1. インクルードがありません(編集:もう必要ないようです)

    #include "boost/variant/static_visitor.hpp"
    
  2. また、代わりに

    boost::get<Point>(myShape) = myPoint;
    

    あなたはやりたいだけです

    myShape = myPoint;
    

    それ以外の場合、バリアントに実際にPointまだ含まれていない場合は、boost::bad_get例外が発生します。

  3. ついに

    boost::apply_visitor(ShapeVisitor(3,4), myPoint);
    

    になるはずだった

    boost::apply_visitor(ShapeVisitor(3,4), myShape);
    

これらすべてのポイントを示す単純な自己完結型の例は次のようになります:

#include "boost/variant.hpp"
#include "boost/variant/static_visitor.hpp"

struct Point { int X,Y; };

typedef boost::variant<int,Point> ShapeType;

class ShapeVisitor : public boost::static_visitor<> 
{
private:
    double m_dx; // point x coord
    double m_dy; // point y coord

public:    
    ShapeVisitor(double m_dx, double m_dy) : m_dx(m_dx), m_dy(m_dy) { }

    void operator () (int& p) const { }

    // visit a point
    void operator () (Point& p) const
    {
        p.X += m_dx;
        p.Y += m_dy;
    }
};

int main()
{   
    Point myPoint{ 1,2 };

    ShapeType myShape(myPoint);
    boost::apply_visitor(ShapeVisitor(3,4), myShape);

    myPoint = boost::get<Point>(myShape);
    std::cout << myPoint.X << ", " << myPoint.Y << std::endl;
}

出力:

4, 6
于 2012-10-06T23:50:17.053 に答える