C++ 设计模式,对象向量,两种可能类型中的每一种
我需要在一个向量中存储两种类型的对象,这两种类型几乎没有共同点 在将它们存储到向量中之后,我希望迭代该向量并根据类型执行操作 到目前为止,我的想法是: 多态性。杀伤力过大,对我帮助不大,因为我可能会这样做:C++ 设计模式,对象向量,两种可能类型中的每一种,c++,design-patterns,vector,polymorphism,C++,Design Patterns,Vector,Polymorphism,我需要在一个向量中存储两种类型的对象,这两种类型几乎没有共同点 在将它们存储到向量中之后,我希望迭代该向量并根据类型执行操作 到目前为止,我的想法是: 多态性。杀伤力过大,对我帮助不大,因为我可能会这样做: if(dynamic_cast<T1>() != nullptr) { ... } else { ... } 第二 一: 使用或任何其他基于堆栈的区分联合容器。我也建议 请注意,C++17将具有。Use或任何其他基于堆栈的区分联合容器。我也建议 请注意,C++17
if(dynamic_cast<T1>() != nullptr) {
...
} else {
...
}
第二
一:
使用或任何其他基于堆栈的区分联合容器。我也建议
请注意,C++17将具有。Use或任何其他基于堆栈的区分联合容器。我也建议
请注意,C++17将有。如果您知道您只有两种类型,并且这个数字在将来不会增加,那么C-ish标记的联合就足够了,而且很容易使用:
struct PatternMatch {
int length;
int indexInDict;
};
struct NoMatch {
std::string rawChars;
};
struct TaggedUnion {
enum { MATCH, NO_MATCH } flag;
union {
PatternMatch match;
NoMatch noMatch;
};
};
现在,您可以创建一个TaggedUnions向量,并检查flag数据成员以找出每个元素的实际类型。如果您知道您只有两种类型,并且这个数字在将来不会增加,那么C-ish标记的并集就足够了,而且很容易使用:
struct PatternMatch {
int length;
int indexInDict;
};
struct NoMatch {
std::string rawChars;
};
struct TaggedUnion {
enum { MATCH, NO_MATCH } flag;
union {
PatternMatch match;
NoMatch noMatch;
};
};
现在,您可以创建一个TaggedUnions向量,并检查flag数据成员以了解每个元素的实际类型。为什么不创建一个包含两个成员变量的类呢。一个是PatternMatch,第二个是NoMatch。然后创建一个包含该类对象的向量?如果使用继承和虚函数,则不需要进行任何动态转换。事实上,这就是多态性的全部含义,而dynamic_cast则代表了完全相反的方法。为什么不使用两个向量呢?我认为我们需要更多地了解这两种类型的操作,以便找到一个优雅的解决方案tbh。为什么不创建一个包含两个成员变量的类呢。一个是PatternMatch,第二个是NoMatch。然后创建一个包含该类对象的向量?如果使用继承和虚函数,则不需要进行任何动态转换。事实上,这就是多态性的全部含义,而dynamic_cast代表了完全相反的方法。为什么不使用两个向量呢?我想我们需要了解更多关于这两种类型的操作,以便有希望找到一个优雅的解决方案tbh。我现在避免了工会,但我有点害怕魔法。。。但这似乎是解决我问题的办法problem@J0hnD0e事实上,工会背后并没有魔力,有时它们也很有用,为什么不呢-我现在有点害怕魔法了。。。但这似乎是解决我问题的办法problem@J0hnD0e事实上,工会背后并没有魔力,有时它们也很有用,为什么不呢-我还想到了访问者模式,唯一一个我不能简单解决的问题是:我想在迭代集合时将两个连续的Nomatch合并成一个,但我没有说在问题中我也想到了访问者模式,唯一一个我不能简单解决的问题,is:我想在迭代集合时将两个连续的nomatch合并为一个,但我在问题中没有这样说
// Either `A` or `B`.
using my_type = boost::variant<A, B>;
std::vector<my_type> my_vec;
// ...`emplace_back` stuff into `my_vec`...
auto visitor = make_lambda_visitor<void>(
[](A&) { /* do something with A */ },
[](B&) { /* do something with B */ }
);
for(auto& x : my_vec)
{
boost::apply_visitor(visitor, x);
}
struct PatternMatch {
int length;
int indexInDict;
};
struct NoMatch {
std::string rawChars;
};
struct TaggedUnion {
enum { MATCH, NO_MATCH } flag;
union {
PatternMatch match;
NoMatch noMatch;
};
};