パラメータとして 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キャストする必要があるため、これは予想される行列についても、入力と出力に使用されるパラメーターについても何も明らかにしません。私が理解しているように、これがすべての関数パラメーターで固有式を許可する唯一の方法です。洗練されていない式のサポートにもかかわらず、最初のスニペットの方が好感が持てます。
私の質問:
- この例では、2 番目のコード スニペットが最適なソリューションだと思いますか?
- 出力パラメータに const-cast ソリューションを使用したことがありますか、それとも透明性を失う価値がないと思いますか?
- 固有関数の記述に使用するガイドライン/ベスト プラクティスは何ですか?