c++类MatLab构造函数重载

C++ MatLab like constructor overloading

本文关键字:重载 构造函数 MatLab c++      更新时间:2023-10-16

我有一个类Sparse_Matrix,它允许我有效地处理稀疏矩阵。

我想通过使用特定的(惯用的)关键字如Upper、Identity等来实例化一个特定的矩阵。

这是我的类声明(命名空间矩阵)

template <typename T>
class Sparse_Matrix
{
  private:
  int rows;
  int cols;
  std::vector<int> col;
  std::vector<int> row;
  std::vector<T> value;
  ...

是否有办法获得一个预初始化的对象?

 Sparse_Matrix<int> = Eye(3);

将返回一个3 × 3的单位矩阵。

我已经看过构造函数的习惯用法,但是这些构造函数需要一些与我的类不兼容的静态类型(尽管我愿意接受建议)。

我也试过这个代码:

template <typename T>
Sparse_Matrix<T> Eye(int size)
{
  Sparse_Matrix<T> ma;
  ma.IdentityMatrix(size);
  std::cout << "Eye!" << std::endl;
  return ma;
}

Sparse_Matrix<int> blah = Eye(10);

但无济于事。

谢谢你,

SunnyBoyNY

在c++中只有一个地方可以根据表达式的使用方式推导模板形参:用户定义的转换操作符。

struct Eye
{
    int size;
    explicit Eye(int requestedSize) : size(requestedSize) {}
    template<typename T>
    operator SparseMatrix<T>() const { SparseMatrix<T> ma; ma.IdentityMatrix(size); return ma; }
};

现在你可以写

Sparse_Matrix<int> blah = Eye(10);

使用构造对象的函数是一个很好的策略。在您的示例中,一种解决方案是专门告诉Eye类型:

Sparse_Matrix<int> blah = Eye<int>(10);

有时为了清晰起见,这些函数在类中是静态的:

template<typename T>
class Sparse_Matrix
{
public:
    static Sparse_Matrix<T> Eye(...) {...}
};

在这种情况下,您将调用:

Sparse_Matrix<int> blah = Sparse_Matrix<int>::Eye(10);