LineSegment<T,dim>
テンプレート化されたクラスで2つのEigen3ベクトルをラップしています。あなたはそれをこのように使うかもしれません:
typedef LineSegment<double,2> LineSegment2d;
typedef LineSegment<double,3> LineSegment3d;
typedef LineSegment<int,3> LineSegment3i;
これには、コンポーネントの寸法を変更するためのテンプレート化されたメソッドが含まれています。トリミングされた定義は次のとおりです。
template<typename T,int dim>
struct LineSegment
{
public:
template<int newDim>
LineSegment<T,newDim> to() const
{
Eigen::Matrix<T,newDim,1> newp1;
Eigen::Matrix<T,newDim,1> newp2;
// TODO initialise newp1 and newp2 from d_p1 and d_p2
return LineSegment<T,newDim>(newp1, newp2);
}
// ... other members ...
protected:
Eigen::Matrix<T,dim,1> d_p1;
Eigen::Matrix<T,dim,1> d_p2;
}
だから私の質問は、上記のように、どのように戻り値を構成することができますか?これは、ディメンションの増加と減少の両方をサポートする必要があります。
Eigen3のresize(int)メソッドを使用しようとしましたが、行列サイズの混合に関する警告が表示されない限り、機能させることができませんでした。
最終的に、これは機能するはずです。
LineSegment2d ls2d;
LineSegment3d ls3d = ls2d.to<3>(); // increase dim
ls2d = ls3d.to<2>(); // decrease dim
私はC++テンプレートに比較的慣れていないので、これが単なるAPIの質問ではなく、テンプレートに関連している場合は、少し説明していただければ幸いです。