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