boost::units
科学プロジェクトで物理的な一貫性を確保するためにライブラリを使用しています。ブーストのドキュメントからいくつかの例を読んで試しました。寸法、単位、数量を作成できます。私はいくつかの計算をしました、それは非常にうまくいきます。それはまさに私が期待したものです...
私のプロジェクトでは、6 つの次元に基づくいくつかの異なる単位 (温度、濃度、密度など) を持つ時系列を扱います。安全で簡単な単位変換を可能にするために、時系列のディメンションと単位を表すメンバーを各チャネル クラスに追加したいと思います。また、データ処理 (インポート、変換など) はユーザー主導であるため、動的です。
私の問題は次のとおりです。boost::units
構造のため、均質なシステム内の数量は異なりますが、次元が異なると、タイプが異なります。したがって、次のようなメンバーを直接宣言することはできません。
boost::units::quantity channelUnits;
コンパイラは、テンプレートのシェブロンを使用して寸法を指定する必要があると主張します。しかし、そうすると、異なるタイプの数量 (たとえば、異なる次元の数量) を格納できなくなります。
次に、boost::units::quantity
宣言を探して、ポリモーフィックな方法で使用できる基底クラスがあるかどうかを調べました。しかし、私はそれを見つけていません。代わりに、テンプレート メタ プログラミングboost::units
を多用していることを発見しました。これは問題ではありませんが、すべてが実行時ではなくコンパイル時に解決されるため、動的なニーズに正確には適合しません。
さらに読んだ後、オブジェクトにさまざまな量をラップしようとしましたboost::variant
(初めて会えてうれしいです)。
typedef boost::variant<
boost::units::quantity<dim1>,
...
> channelUnitsType;
channelUnitsType channelUnits;
いくつかのテストを実行しましたが、うまくいくようです。しかし、私はboost::variant
と訪問者パターンに自信がありません。
私の質問は次のとおりです。
- 実行時の型解決を行うための別の - おそらく最良の - 方法はありますか?
dynamic_cast
それらの1つですか?単位変換は頻繁には行われず、関係するデータはごくわずかです。- 適切なソリューションである場合
boost::variant
、その欠点は何ですか?