2

パラメータとして Eigen オブジェクトを使用する関数の設計は面倒です。Eigen Documentationの情報は役に立ちますが、テンプレートの引数に対する厄介なアプローチを示唆しています。線-平面-交差のような幾何学的ルーチンを書きたいとします。シンプルで透過的なアプローチは次のようになります。

template<typename _Tp> 
bool planeLineIntersect(const Eigen::Matrix<_Tp, 3, 1>& planePoint, 
                        const Eigen::Matrix<_Tp, 3, 1>& planeNormal, 
                        const Eigen::Matrix<_Tp, 3, 1>& linePoint, 
                        const Eigen::Matrix<_Tp, 3, 1>& lineDir,
                        Eigen::Matrix<_Tp, 3, 1>& intersectionPoint)

これは比較的快適に見え、これを見た人は、すべてのパラメーターが同じタイプの 3D ベクトルでなければならないことを知ることができます。ただし、直接的には、これはあらゆる種類の Eigen 式を許可しません (使用するすべての式に対して Eigen::Matrix コンストラクターを呼び出す必要があります)。したがって、これで式を使用する場合は、不要な一時変数を作成する必要があります。

推奨される解決策は次のとおりです。

template<typename Derived1, typename Derived2, typename Derived3, typename Derived4, typename Derived5> 
bool planeLineIntersect(const Eigen::MatrixBase<Derived1>& planePoint, 
                        const Eigen::MatrixBase<Derived2>& planeNormal, 
                        const Eigen::MatrixBase<Derived3>& linePoint, 
                        const Eigen::MatrixBase<Derived4>& lineDir,
                        const Eigen::MatrixBase<Derived5>& intersectionPoint)

出力パラメーターで式を許可するためにintersectionPointをconstキャストする必要があるため、これは予想される行列についても、入力と出力に使用されるパラメーターについても何も明らかにしません。私が理解しているように、これがすべての関数パラメーターで固有式を許可する唯一の方法です。洗練されていない式のサポートにもかかわらず、最初のスニペットの方が好感が持てます。

私の質問:

  1. この例では、2 番目のコード スニペットが最適なソリューションだと思いますか?
  2. 出力パラメータに const-cast ソリューションを使用したことがありますか、それとも透明性を失う価値がないと思いますか?
  3. 固有関数の記述に使用するガイドライン/ベスト プラクティスは何ですか?
4

1 に答える 1