1

我有一个类 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

4

2 回答 2

2

拥有一个构造对象的函数是一个很好的策略。在您的示例中,一种解决方案是专门告诉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);
于 2013-01-11T02:36:37.767 回答
2

There's only one place in C++ where template parameters can be deduced based on how the expression is used: a user-defined conversion operator.

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; }
};

Now you can write

Sparse_Matrix<int> blah = Eye(10);
于 2013-01-11T02:41:52.103 回答