C ++将未知类型传递给具有抽象基础的对象

时间:2013-02-27 09:13:52

标签: c++ events abstract-class strategy-pattern

我的previous question关于抽象的问题后面还有另外一个问题,我在创建事件后设置数据时遇到了另一个问题。

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

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* );

这样,我会让对象以自己的方式处理数据。关于如何解决这个问题的任何建议都会非常感激,但是我真的想避免使用模板。

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

2 个答案:

答案 0 :(得分:1)

您可以使用Boost.Any传输未知数据。在源站点上,您只需使用asignment,在sink站点上使用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

答案 1 :(得分:0)

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

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