我正在使用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
是一个合适的解决方案,它的缺点是什么?