【发布时间】:2013-12-17 09:52:34
【问题描述】:
我正在使用boost::units 库来强制科学项目中的物理一致性。我已经阅读并尝试了 boost 文档中的几个示例。我能够创建我的尺寸、单位和数量。我做了一些微积分,效果很好。这正是我所期望的,除了......
在我的项目中,我处理基于六个维度的具有多个不同单位(温度、浓度、密度等)的时间序列。为了允许安全和简单的单位转换,我想为每个通道类添加一个成员,表示时间序列的维度和单位。而且,数据处理(导入、转换等)是用户驱动的,因此是动态的。
我的问题如下,由于boost::units 结构,同质系统中但具有不同维度的量具有不同的类型。因此,您不能直接声明成员,例如:
boost::units::quantity channelUnits;
编译器会声称您必须使用模板 V 形指定尺寸。但如果这样做,您将无法存储不同类型的数量(例如具有不同维度的数量)。
然后,我查找了boost::units::quantity 声明,以确定是否有可以以多态方式使用的基类。但我没有找到它,相反我发现boost::units 大量使用 模板元编程 这不是问题,但不完全符合我的动态需求,因为一切都在编译时解决而不是在运行时。
经过更多阅读,我尝试将不同的数量包装在 boost::variant 对象中(很高兴第一次见到它)。
typedef boost::variant<
boost::units::quantity<dim1>,
...
> channelUnitsType;
channelUnitsType channelUnits;
我进行了一些测试,它似乎有效。但我对 boost::variant 和 visitor-pattern 没有信心。
我的问题如下:
- 还有其他(也许是最好的)方法来进行运行时类型解析吗?
-
dynamic_cast是其中之一吗?单位转换不会经常发生,只需要关注少量数据。 - 如果
boost::variant是一个合适的解决方案,它的缺点是什么?
【问题讨论】:
标签: c++ physics boost-units