简单的财产制度

时间:2011-09-12 09:23:26

标签: c++

我遇到了一个小的设计困境。它本身并不是一个“问题”,只是困扰我,我找不到更清洁的解决方案:)我希望你们中的一些人可能有一些好的想法或替代解决方案。

假设我有一些数据可以随时通过通信通道(串行/ IP,e.t.c)进行同步。各个数据都很小,比如整数或浮点数。它们与发送数据的机器的某些状态有关。我不想设计一个简单的“属性”系统,在收到单个数据项时,或者在收到MULTIPLE数据项时,我会收到警报。例如,当我成功收集两个整数和一个浮点数时,会给我一个警报。

让我们说远程系统可以发送给我:

DATA1 : float
DATA2 : int
DATA3 : int
DATA4 : double
DATA5 : short

现在,在伪代码中,我想要做的就是这样(使用宏或其他)

PROPERTY(DATA1)
PROPERTY(DATA2, DATA3)
PROPERTY(DATA4)

也就是说,每个属性监视一个可变数量的数据块,并在监视所有被监视的部分已经更改/填充时向我发送一个SINGLE警报。

目前我正在使用sigc ++,我认为这是一个出色的回调库。我有一个有效的实现,但代码很麻烦,因为C ++并不真正支持变量参数列表,就像我想要的那样,所以我到目前为止所做的是有一个类,PROPERTY,它有一个数字重载的构造函数,支持1到X个参数,这不是真正的“动态”。如果我需要监视更多变量,我需要确保有一个构造函数来处理参数的数量。

也许只是我试图过度设计:)

2 个答案:

答案 0 :(得分:1)

我会编写一个Property类来存储数据块的集合。每个块都是Boost.Variant或某种类型的并集,或指向实现数据块接口的对象的指针。

该类可以初始化为

Property p;
p.addInt(xI).addFloat(xF).addShort(xS);

或喜欢

Property p = { IntVal(xI), FloatVal(xF), ShortVal(xS) };

如果可以使用C ++ 0x初始化列表,其中IntVal等是将更原始数据块类型转换为Property集合中使用的变体类型的包装器。

答案 1 :(得分:0)

你在谈论某种串行通信,所以你必须有一些机制告诉你的程序该串行线路的数据是什么。否则,如何区分两个32位整数与双精度或八个变量数组?

这表明为某些基本消息类型的每个消息类型创建了一个类。如果你的消息本质上非常简单(例如,它们包含一个整数,两个整数,一个双精度),你可能可以使用一个联合或类似的东西,但你仍然需要一些键来指示联合的哪个元素是适用的。

收集传入消息的处理程序可能是一个讨厌的,复杂的野兽。我已经看到了一些(我没有写过这样的野兽),其复杂度为500 +。