固定サイズの固有型を取る関数を作成しようとしています (ただし、float/double などのスカラー型でテンプレート化されています)。http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.htmlを読みましたが、完全に機能させることはできません。
関数定義は次のとおりです。
template <typename T>
inline Matrix<T, 3, 3> makeSkewSymmetric(const Matrix<T, 3, 1>& v)
{
Matrix<T, 3, 3> out;
out << 0, -v[2], v[1],
v[2], 0, -v[0],
-v[1], v[0], 0;
return out;
}
今、私はこれを次のように使用しています:
Vector3d a(1,2,3);
Matrix3d ass = makeSkewSymmetric(a); // Compiles
Matrix3d ass = makeSkewSymmetric(a + a); // does NOT compile
ある種の を使用する必要があると思いますがMatrixBase<Derived>
、関数は長さ 3 のベクトルに対してのみ意味があるため、サイズを制限するにはどうすればよいでしょうか。
編集:関数を次のように再定義しました。それはうまくいきますが、より良い方法はありますか?
template <typename Derived>
inline Matrix<typename Derived::Scalar, 3, 3> makeSkewSymmetric(const MatrixBase<Derived>& v)
{
BOOST_STATIC_ASSERT(Derived::RowsAtCompileTime == 3 && Derived::ColsAtCompileTime == 1);
Matrix<typename Derived::Scalar, 3, 3> out;
out << 0, -v[2], v[1],
v[2], 0, -v[0],
-v[1], v[0], 0;
return out;
}