我将两个Eigen3 vector 包装在模板化的LineSegment<T,dim>类中。您可以这样使用它:

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问题,而且与模板有关,请多多解释。

最佳答案

首先,如果新元素的数目与旧元素的数目不同,则本征的resize方法在增长和缩小时都会重新分配内存,因此在这种情况下您将丢失数据

以下方法使用 .head<int>() ,它是Eigen3的.start<int>()版本,再加上一些模板编程,因此您不必检查收缩还是增长:

#include <Eigen/Core>

template <bool COND, int A, int B>
struct IF
{
  enum { val = A };
};

template <int A, int B>
struct IF<false, A, B>
{
  enum { val = B };
};

template <int A, int B>
struct MIN : IF<A < B, A, B>
{
};

template <typename T,int dim,int newDim>
Eigen::Matrix<T,newDim,1> to(Eigen::Matrix<T,dim,1> p)
{
  Eigen::Matrix<int,newDim,1> newp =
    Eigen::Matrix<T,newDim,1>::Zero();

  newp.template head< MIN<dim,newDim>::val >() =
    p.template head< MIN<dim,newDim>::val >();

  return newp;
}

使用以下程序:
#include <iostream>

int main()
{
  Eigen::Vector2i p_2i(1,2);
  Eigen::Vector3i p_3i(3,4,5);

  std::cout << to<int, 2, 3>(p_2i) << std::endl << std::endl;
  std::cout << to<int, 3, 2>(p_3i) << std::endl << std::endl;

}

给出作为输出:
1
2
0

3
4

09-08 05:48