0

我不知道如何命名这个问题,所以我会尽量解释清楚。

我希望能够根据两个不同对象的类型切换策略。为了完成这项工作,我正在考虑使用枚举类型标记对象,并拥有这些策略的“注册表”(数组)。理想情况下,正确的策略可以通过一些简单的操作来访问,比如两种类型之间的位运算符。

这个伪代码可能会使我试图解释的内容更容易理解:

enum Type { A, B, C }

struct Object {
  Type type;
}

class ActionRunner {
  vector<Strategy> strategies;

  void registerStrategy(type1, type2, strategy) {
    strategies[type1 operator type2] = strategy;
  }

  void runStrategyFor(type1, type2) {
    strategies[type1 operator type2].execute();
  }
}

使用地图很容易解决这个问题,但我想使用数组或向量,因为对于这样的问题,地图似乎有点过头了,而使用数组可能要快得多。

所以问题是我不知道我可以使用什么运算符来选择正确策略的“位置”。我一直在考虑一些组合,但似乎它们最终都会在某些时候与不同的组合发生冲突。

有没有人有任何线索/建议我可以用来做这个?

PS:我知道过早优化不好,但我只是想弄清楚这个问题是否可以通过简单的方式解决。

- - - - 编辑 - - - - - - - - - - - - - - - - - - - - - ------

根据答案,我一直在对这个问题进行一些额外的思考,我得出的结论是,我对这个问题的意图不可能按照我想要的方式。我将尝试使用此问题重新陈述我现在尝试解决的问题。

我想要一个类结构,其中有某种类型的“BaseClass”对象和一个“处理器”对象,该对象采用从“BaseClass”派生的两个对象并为这些对象运行正确的策略。像这样的东西:

class Processor {
  void run (DerivedA a, DerivedB b);
}

class BaseClass {}
class DerivedA: public BaseClass {}
class DerivedB: public BaseClass {}

BaseClass a = new DerivedA;
BaseClass b = new DerivedB;

processor.run(a, b)

据我了解,如果作为参数传递给“运行”的是引用,这将不会像我预期的那样工作,这是我宁愿做的。没有太复杂的代码有没有办法做到这一点?(三连发!?)

我想到了双重调度与我认为可以工作的从属(处理器)对象相结合的东西,但这似乎非常复杂,维护和扩展可能很痛苦。

谢谢!

4

2 回答 2

0

你问题的第二句话为我敲响了警钟:

我希望能够根据两个不同对象的类型切换策略。

这听起来像您想要执行双重调度。有关如何在 C++ 中实现此功能,请参阅 C++ 中的Double dispatch/multimethods 中的问题(特别是问题的答案 ;-)) 。

于 2012-12-21T10:55:40.043 回答
0

这是使用map而不是数组的经典示例。数组实际上是mapkey 定义为整数的私有情况。在您的情况下,键是一个元组,所以一个简单的数组不会这样做,并且您最终会遇到冲突(即使您对特定输入很幸运,您的代码也将非常不健壮)。

您可以有一个介于 simplearraymap:之间的中间解决方案,2D array您的 2 种类型用作行和列的索引。

于 2012-12-21T10:58:18.753 回答