【问题标题】:retrieving objects from boost::variant从 boost::variant 中检索对象
【发布时间】:2013-07-18 12:38:52
【问题描述】:

我之前尝试过提出问题,但我认为我提出问题的方式不合适。所以我在这里再次尝试:(我仍然不知道什么主题合适)

首先我定义

typedef boost::variant<point, Line, Vertex> vec_variant;
typedef std::vector<vec_variant> vec;

我编写函数取决于它返回点、线、 顶点,甚至是它们的组合。

vec my_func::select_T(const mesh::section& s, const char* model) const
{
  vec new_vec;
  .
  .
  .
  .
 //loop over my lines
  else if ( strcmp(model , "Line") == 0 )
  {
    for(section::lineIterator ite = s.beginLine(); ite != s.endLine(); ++ite )
    {
      Line ed = *ite;
        Point p0 = ed.point(0);
        Point p1 = ed.point(1);
        Point p0_modified ( /* some modification */  );
        Point p1_modified ( /* some modification */  ); 

        if( /* some other conditions */ )
        {
          new_vec.push_back(ed);
          new_vec.push_back(p0_modified); //note before pushing back any point 
          new_vec.push_back(p1_modified); //first I pushed back line
        }

         else if ( /* some other conditions */ )
         {
           .
           .
           .
           vertex m = .......;
           new_vec.push_back(ed);
           new_vec.push_back(m);  //note before pushing back any point 
                                  //first I pushed back line
         }
      }
    }
  }
      return new_vec;
    }

所以最后我们可能会有这样的东西 {ed, p0_modified, p0_modified, ed, m, ed, m, ed, p0_modified, p0_modified, ed, m, ....} {线,点,点,线,顶点,线,顶点,线,点,点,线,顶点,...}

现在我在代码的另一部分(不同的文件)调用这个函数

first I defined a visitor:

    template<typename T>
    struct T_visitor : public boost::static_visitor<>
    {
       T_visitor(std::vector<T>& v) : zeroVector(v) {}
       template<typename U>
       void operator () (const U&) {}
       void operator () (const T& value)
       {
          zeroVector.push_back(value);
       }
    private:
       std::vector<T>& zeroVector;
    };

我在这里调用了上面的函数:

void func_2( /*......*/ )
{
  . //we can use above visitor to store each type (point, line, Vertex) in vactor<point or line or Vertex)
  . //we do not know what the new_vec is at the end of the loop. the only thing we know is that after each line there
  . //would be either two points or one vertex
  .
  const char *model = "Edge";
  .
  .//How to find line ed and corresponded points?
  .
  create_line( Point& p0_modified, Point& p1_modified, Line& ed);    //two modified points and line
  .
  .//How to find point m and corresponded line?
  .
  create_point( m(0), m(1), m(2), Line& ed);    //point m coordinates and line
  .
  .
}

【问题讨论】:

    标签: c++ stdvector boost-variant apply-visitor


    【解决方案1】:

    所以您的数据结构当前是PointLineVertex 对象的序列(我将假设第一句中的Surface 是一个错字)。您还知道任何Line 后面必须跟两个Points 或一个Vertex 的附加限制。现在你想使用这个结构。

    这是可能的,但也很烦人。我可以建议您简单地更改您的数据结构吗?

    struct LineWithPoints {
      Line line;
      Point p1, p2;
    };
    struct LineWithVertex {
      Line line;
      Vertex v;
    };
    typedef boost::variant<LineWithPoints, LineWithVertex> vec_variant;
    typedef std::vector<vec_variant> vec;
    

    并更改您的代码以生成此序列。然后使用它变得微不足道。

    【讨论】:

    • typedef boost::variant&lt; std::array&lt;Point,2&gt;, Vertex &gt; AfterLine; struct LineWithAfter { Line line; AfterLine after; }
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多