извлечение объектов из Boost :: вариант

Я пытался задать свой вопрос раньше, но я думаю, что способ, которым я задаю свой вопрос, не является правильным. поэтому я попробовал еще раз здесь: (до сих пор я не знаю, какой предмет будет уместным)

сначала я определил

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
.
.
}

1

Решение

Таким образом, ваша структура данных в настоящее время представляет собой последовательность Point, Line, а также Vertex объекты (я собираюсь предположить, что Surface в первом предложении это опечатка). Вы также знаете дополнительное ограничение, которое любое Line должны следовать либо два Pointс или один 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;

И измените свой код, чтобы произвести эту последовательность вместо этого. Тогда работа с ним становится тривиальной.

4

Другие решения

Других решений пока нет …