0

在我之前关于抽象的问题之后,我还有另一个问题,我还有一个与在事件中设置数据有关的问题,一旦它被创建。

就目前情况而言,我可以创建任何类型的事件并毫无问题地应用它们的数据(使用策略设计模式的修改版本)。问题是我目前必须在创建事件时将其数据传递给它。

IEvent* newEvent = new SpeedEvent( eventID, interpolation, 50.0f );

或者

IEvent* newEvent = new AnimationEvent( eventID, interpolation, &newAnimation );

当我知道创建对象时的数据是什么时,这种方法很好,但是在很多情况下我不知道实例化时的数据是什么。

理想的情况是创建一个这样的新事件:

IEvent* newEvent = new SpeedEvent( eventID, interpolation );

然后以这种方式为其分配数据:

eventManager->assignData( eventID, *unknown data type* );

这样,我会让对象以自己的方式处理数据。任何有关如何解决此问题的建议将不胜感激,但是如果可以的话,我真的想避免使用模板。

我当前的数据和对象结构与我上一个问题的答案中建议的非常相似。

4

2 回答 2

1

您可以使用Boost.Any传输未知数据。在源站点上,您只需使用分配,在接收器站点上,您使用 any_cast 来恢复您的价值。

编辑一个小代码:

只需使用 boost::any 作为未知数据类型并将您的值(使用您的具体类型)分配给它。在您需要使用any_cast 的具体类型的一侧。

class EventManager {
  //...
public:
  void asignData(std::size_t eventId, boost::any value);
  boost::any getData(std::size_t eventId) const;
};

eventManager->assignData( eventId, 12);  // assignes an int
eventManager->assignData( eventId, 12.0);  // assignes an double


int value1=boost::any_cast<int>(eventManager->getData(eventID)); // gets an int
double value2=boost::any_cast<double>(eventManager->getData(eventID)); // gets a double
于 2013-02-27T09:25:50.097 回答
0

如果您对数据没有限制,请使用 good oldvoid *作为数据类型。在具体处理程序内部转换为处理程序内部已知的正确类型。

如果您想对数据施加限制,请定义概述数据规范的接口/基础,并为每种可能的具体数据类型从其继承。将派生类型的数据发送到您的通用处理程序(接受指向基类的指针)。在处理程序内部,您可以使用为数据定义的公共接口,也可以简单地转换为具体类型。

于 2013-02-27T09:23:53.630 回答