我的 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* );
这样,我会让对象以自己的方式处理数据。任何有关如何解决此问题的建议将不胜感激,但我真的想尽可能避免使用模板。
我当前的数据和对象结构与我上一个问题的答案中建议的结构非常相似。
最佳答案
您可以使用 Boost.Any传输未知数据。在源站点上,您只需使用分配,而在接收站点上,您可以使用 any_cast 来恢复您的值(value)。
编辑一小段代码:
只需将 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
关于C++ 将未知类型传递给具有抽象基础的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108166/