C++ 合并两个不同类型的std::列表:可能吗?

C++ 合并两个不同类型的std::列表:可能吗?,c++,stdlist,C++,Stdlist,我有一个Foo*类型的std::列表和另一个大小不等的Bar*类型的列表。这两种类型都实现了一个定位系统,该系统允许按z坐标对列表进行排序,以获得绘图顺序(实际上只是一个具有x、y、z值的点,并且使用小于谓词的函数按z值对其进行排序) 除了上面提到的,它们是完全不同的。有没有一种方法可以组合这些列表,这样我就可以比较所有的z值,而不仅仅是它们自己的类型 例如,现在,要么所有的foo都被排序,要么所有的条都被排序;然后要么绘制所有的foo,要么绘制所有的条。这使得即使一个条的z比一个Foo低,它也

我有一个Foo*类型的std::列表和另一个大小不等的Bar*类型的列表。这两种类型都实现了一个定位系统,该系统允许按z坐标对列表进行排序,以获得绘图顺序(实际上只是一个具有x、y、z值的点,并且使用小于谓词的函数按z值对其进行排序)

除了上面提到的,它们是完全不同的。有没有一种方法可以组合这些列表,这样我就可以比较所有的z值,而不仅仅是它们自己的类型

例如,现在,要么所有的foo都被排序,要么所有的条都被排序;然后要么绘制所有的foo,要么绘制所有的条。这使得即使一个条的z比一个Foo低,它也会被画在顶部。显然不是预期的结果

当我输入这段文字时,我有了一个顿悟,并行处理会起作用吗?分别对每个列表进行排序,然后交替绘制它们、Foo、Bar、Foo、Bar等,或者这会导致相同的问题吗?某些图形高于其他图形,而不考虑z值


谢谢。

您可以尝试让这两种类型都从包含位置的基继承,也许可以使用
虚拟绘制()

如果只想保留一个列表,但有两种完全不同的类型,也可以使用变体:

struct visitor
{
    float operator()(Foo* f) const { return f->z_position; }
    float operator()(Bar* b) const { return b->z_position; }
};

std::list<boost::variant<Foo*, Bar*>> list;

//...

list.sort([](boost::variant<Foo*, Bar*> const &left, boost::variant<Foo*, Bar*> const &right)
{
    return apply_visitor(visitor(), left) < apply_visitor(visitor(), right);
});

for(auto iter = list.begin(), end = list.end(); iter != end; ++iter)
{
    (*iter)->Draw();
}
struct访问者
{
浮点运算符()(Foo*f)常量{return f->z_position;}
浮点运算符()(Bar*b)常量{return b->z_position;}
};
std::列表;
//...
list.sort([](boost::variant const&left,boost::variant const&right)
{
返回apply_visitor(visitor(),左)Draw();
}

您可以尝试让这两种类型都从包含位置的基继承,也许可以使用
虚拟绘制()

如果只想保留一个列表,但有两种完全不同的类型,也可以使用变体:

struct visitor
{
    float operator()(Foo* f) const { return f->z_position; }
    float operator()(Bar* b) const { return b->z_position; }
};

std::list<boost::variant<Foo*, Bar*>> list;

//...

list.sort([](boost::variant<Foo*, Bar*> const &left, boost::variant<Foo*, Bar*> const &right)
{
    return apply_visitor(visitor(), left) < apply_visitor(visitor(), right);
});

for(auto iter = list.begin(), end = list.end(); iter != end; ++iter)
{
    (*iter)->Draw();
}
struct访问者
{
浮点运算符()(Foo*f)常量{return f->z_position;}
浮点运算符()(Bar*b)常量{return b->z_position;}
};
std::列表;
//...
list.sort([](boost::variant const&left,boost::variant const&right)
{
返回apply_visitor(visitor(),左)Draw();
}

我认为你的顿悟会很有效。。。为每个列表保留一个单独的迭代器,并始终绘制“当前项”具有较低Z值的列表,然后对其进行迭代。重复上述步骤,直到两个列表都结束。瞧,我想你的顿悟会很好的。。。为每个列表保留一个单独的迭代器,并始终绘制“当前项”具有较低Z值的列表,然后对其进行迭代。重复上述步骤,直到两个列表都结束。Et瞧。直到现在才有机会测试它,在绘图时单独排序和合并效果非常好!:D感谢您的洞察力。直到现在才有机会测试它,在绘图时单独排序和合并效果非常好!:D谢谢你的洞察力。
struct visitor
{
    float operator()(Foo* f) const { return f->z_position; }
    float operator()(Bar* b) const { return b->z_position; }
};

std::list<boost::variant<Foo*, Bar*>> list;

//...

list.sort([](boost::variant<Foo*, Bar*> const &left, boost::variant<Foo*, Bar*> const &right)
{
    return apply_visitor(visitor(), left) < apply_visitor(visitor(), right);
});

for(auto iter = list.begin(), end = list.end(); iter != end; ++iter)
{
    (*iter)->Draw();
}