我不确定如何命名这个问题,所以我会尽力解释。
我希望能够根据两个不同对象的类型切换策略。为了使这个工作,我正在考虑用枚举类型标记对象,并具有这些策略的“注册表”(阵列)。理想情况下,可以通过一些简单的操作来访问正确的策略,例如两种类型之间的按位运算符。
这个伪代码可能使我想解释的内容更容易理解:
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:我知道过早的优化很糟糕,但我只想弄清楚这个问题能否以一种简单的方式解决。------- EDIT --------------------------------------- ---------
根据答案,我一直在给这个问题一些额外的想法,我已经得出结论,我对这个问题的意图不可能按照我喜欢的方式。我将尝试使用这个问题重新陈述我现在试图解决的问题。
我希望有一个类结构,其中有某些类型的'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)
根据我的理解,这不会像我期望的那样,如果作为参数传递给'run'的是引用,这是我宁愿做的。有没有办法在没有太复杂的代码的情况下做到这一点? (tripple dispatch!?)
我想到的是双重调度与我认为可行的奴隶(处理器)对象相结合,但这看起来非常复杂,可能是维护和扩展的痛苦。
谢谢!
答案 0 :(得分:0)
你问题的第二句话响了我一声:
我希望能够根据两个不同对象的类型切换策略。
这听起来像是要执行double dispatch。在Double dispatch/multimethods in C++查看问题(特别是问题的答案;-)),了解如何在C ++中实现它。
答案 1 :(得分:0)
这是使用map
而不是数组的典型示例。 Array实际上是map
的私有案例,其中键被定义为整数。在你的情况下,键是一个元组,所以一个简单的数组不会做,你最终会发生冲突(即使你的特定输入很幸运,你的代码也会非常强大)。
您可以在简单的array
和map
之间建立一个中间解决方案:2D array
,您的两种类型可作为行和列的索引。