J0h*_*D0e 1 c++ polymorphism design-patterns vector
我需要在向量中存储两种类型的对象,这两种类型几乎没有任何共同之处.
将它们存储在向量中之后,我想迭代该向量并执行操作,具体取决于类型.
到目前为止我的想法:
多态性.矫枉过正,对我帮助不大,因为我可能会这样做:
if(dynamic_cast<T1>() != nullptr) {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)合并两种类型(方法和字段)并添加一个布尔值,表示其类型1或2.
这两种模式对我来说都显得十分笨拙,有一个完全简单的解决方案,我根本就看不到.
第一种类型是这样的:
struct PatternMatch {
int length;
int indexInDict;
}
Run Code Online (Sandbox Code Playgroud)
第二个:
struct NoMatch {
std::string rawChars;
}
Run Code Online (Sandbox Code Playgroud)
使用boost::variant或任何其他"基于堆栈的区分联合容器".我还建议使用lambdas访问变体.
// 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);
}
Run Code Online (Sandbox Code Playgroud)
请注意,C++ 17将具有std::variant.