C++ C++;类MatLab构造函数重载

C++ C++;类MatLab构造函数重载,c++,matlab,constructor,C++,Matlab,Constructor,我有一个类稀疏矩阵,它允许我有效地处理稀疏矩阵 我想通过使用特定的(惯用的)关键字(如Upper、Identity等)来实例化一个特定的矩阵 这是我的类声明(名称空间矩阵) 模板 类稀疏矩阵 { 私人: int行; int cols; std::向量col; std::向量行; std::向量值; ... 有没有办法获得预初始化的对象 Sparse_Matrix<int> = Eye(3); Sparse_矩阵=眼睛(3); 将返回一个3乘3的单位矩阵 我已经研究过构造函数习

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

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

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

模板
类稀疏矩阵
{
私人:
int行;
int cols;
std::向量col;
std::向量行;
std::向量值;
...
有没有办法获得预初始化的对象

 Sparse_Matrix<int> = Eye(3);
Sparse_矩阵=眼睛(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;
}
模板
稀疏矩阵眼(整数大小)
{
稀疏矩阵ma;
ma.识别矩阵(尺寸);

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

Sparse_Matrix<int> blah = Eye<int>(10);
稀疏矩阵blah=眼睛(10);
有时,为了清晰起见,这些函数在类中是静态的:

template<typename T>
class Sparse_Matrix
{
public:
    static Sparse_Matrix<T> Eye(...) {...}
};
模板
类稀疏矩阵
{
公众:
静态稀疏矩阵眼(…){…}
};
在这种情况下,您可以调用:

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

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

Sparse_Matrix<int> blah = Eye<int>(10);
稀疏矩阵blah=眼睛(10);
有时,为了清晰起见,这些函数在类中是静态的:

template<typename T>
class Sparse_Matrix
{
public:
    static Sparse_Matrix<T> Eye(...) {...}
};
模板
类稀疏矩阵
{
公众:
静态稀疏矩阵眼(…){…}
};
在这种情况下,您可以调用:

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

在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; }
};
struct-Eye
{
整数大小;
显式眼睛(int requestedSize):大小(requestedSize){}
样板
运算符SparseMatrix()常量{SparseMatrix ma;ma.IdentityMatrix(size);返回ma;}
};
现在你可以写作了

Sparse_Matrix<int> blah = Eye(10);
稀疏矩阵blah=眼睛(10);

在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; }
};
struct-Eye
{
整数大小;
显式眼睛(int requestedSize):大小(requestedSize){}
样板
运算符SparseMatrix()常量{SparseMatrix ma;ma.IdentityMatrix(size);返回ma;}
};
现在你可以写作了

Sparse_Matrix<int> blah = Eye(10);
稀疏矩阵blah=眼睛(10);

什么是“但无效”。具体是什么意思?编译器错误是:
调用“Eye(int)”时没有匹配函数。
什么是“但无效”。具体是什么意思?编译器错误是:
调用“Eye(int)”时没有匹配函数
好吧,你实际上不需要,你只需要添加一个可推断的上下文。@JaredC看起来我刚刚缺少构造函数。现在,为什么这些函数会被声明为静态的?@SunnyBoyNY
不是构造函数。它是用于指定
Eye
函数的类型
t
的语法。你不需要必须使函数成为静态的。有些人喜欢它所构造的类的函数的清晰性,而其他人则不喜欢。但是如果
Eye
是一个静态成员函数,你可以根据需要访问私有成员。@JaredC我明白了。我已经在代码中添加了这个:
静态稀疏矩阵Eye(int-size)
模板稀疏矩阵稀疏矩阵::眼睛(int size){…}
现在可以在主函数中编译这一行:
稀疏矩阵blah=稀疏矩阵::眼睛(10);
我发现很有趣,编译器没有根据第一种类型自动填充第二个模板。实际上,你不需要,你只需要添加一个可推断的上下文。@JaredC看起来我刚刚缺少构造函数。现在,为什么这些函数会声明为静态?@SunnyBoyNY
不是一个构造函数。它是用于指定
Eye
函数的类型
T
的语法。您不必将函数设置为静态。有些人喜欢函数属于其构造的类的清晰性,而其他人则不喜欢。但是如果
Eye
是静态成员函数,您可以访问私有mem如果你需要的话,@JaredC我明白了。我已经在代码中添加了这个:
static Sparse\u Matrix Eye(int size);
template Sparse\u Matrix Sparse\u Matrix::Eye(int size){…}
现在可以在主函数中编译这一行:
Sparse\u Matrix blah=Sparse\u Matrix::Eye(10)我发现有趣的是编译器没有根据第一种类型自动填充第二个模板。我的GCC编译器似乎遇到了一个错误:<代码>错误:ISO C++禁止声明“眼睛”,没有类型< /代码>。和<代码>错误:只有构造函数的声明可以是明确的< /代码>。@ SunnyBoyNY:那么你错过了。拼写了一些东西。它编译得相当好——(使用vector而不是
SparseMatrix
,我对它没有定义)当然,我犯了一个拼写错误——我把结构命名为EXE2,但在<代码>显式< /COD>语句之后没有重命名眼睛。看来我的GCC编译器遇到了一个错误:<代码>错误:ISO C++禁止声明“眼睛”,没有类型< /代码>。和<代码>错误:只有构造函数的声明可以是明确的< /代码>。@ SunnyBoyNY:你拼错了一些东西。它编译得很好——(使用vector而不是我没有定义的
SparseMatrix
)当然,我犯了一个拼写错误-我将结构重命名为Eye2,但没有在
explicit
语句后重命名Eye。