C++ 简单财产制

C++ 简单财产制,c++,C++,我遇到了一个小小的设计困境。这本身并不是一个真正的“问题”,只是让我感到困扰的是,我找不到一个更干净的解决方案:)我希望你们中的一些人可能会有一些好主意或其他解决方案 假设我有一些数据,这些数据可以在通信通道(串行/IP,e.t.c)上不同步地随时到达。单个数据段很小,比如整数或浮点。它们与发送数据的机器的某些状态有关。我不想设计一个简单的“属性”系统,当接收到单个数据项或多个数据项时,我会收到警报。例如,当我成功收集到两个整数和一个浮点值时,会向我发出一个警报 假设远程系统可以向我发送以下信息

我遇到了一个小小的设计困境。这本身并不是一个真正的“问题”,只是让我感到困扰的是,我找不到一个更干净的解决方案:)我希望你们中的一些人可能会有一些好主意或其他解决方案

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

假设远程系统可以向我发送以下信息:

DATA1 : float
DATA2 : int
DATA3 : int
DATA4 : double
DATA5 : short
现在,在伪代码中,我想做的是类似这样的事情(使用宏或其他什么)

也就是说,每个属性都监视可变数量的数据块,并在监视的所有数据块都已更改/填充时向我发送单个警报

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


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

我会编写一个
属性
类来存储数据块的集合。每个区块要么是一个或某种类型的联合,要么是指向实现数据区块接口的对象的指针

该类可以初始化为

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

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

如果可以使用C++0x初始值设定项列表,其中,
IntVal
等是将更原始的数据块类型转换为
属性
集合中使用的变量类型的包装器。

您在这里谈论的是某种串行通信,所以你必须有某种机制来告诉你的程序,串行线下的数据是什么。否则,如何区分两个32位整数与双精度整数或八个字符的数组

这就建议为每个消息类型创建一个类,从一些基本消息类型子类化。如果您的消息本质上非常简单(例如,它们包含一个整数、两个整数、一个双精度),那么您可能可以使用并集或类似的东西,但是您仍然需要一些键来指示并集的哪个元素是适用的


收集传入消息的处理程序可能是一个讨厌的、复杂的野兽。我见过一些圈复杂度为500+的(我没有编写这样的beast)。

可以通过定义helper类来缩短构建时间,该类将收集参数(到某个集合)并将其传递到属性。类似于
属性p(PropList().addInt(xI).addFloat(xF))
。(在C++03中,也就是说,初始值设定项列表在C++11中更容易)。很好,这个解决方案看起来很干净!易于编写,易于扩展。谢谢
Property p = { IntVal(xI), FloatVal(xF), ShortVal(xS) };