我曾尝试问过我的问题,但我认为我提出问题的方式是不正确的。所以我在这里再次尝试:(仍然不知道哪个主题是合适的)
首先我定义
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,....} {Line,Point,Point,Line,Vertex ,线,顶点,线,点,点,线,顶点,...}
现在,我在代码的另一部分(不同文件)中调用此函数
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
.
.
}
所以,你的数据结构是当前的序列Point
,Line
以及Vertex
对象(我要去假设Surface
第一句是笔误)。您还知道附加限制,任何限制都Line
必须后面加2Point
或1 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;
并更改您的代码以生成此序列。然后,使用它就变得微不足道了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句