gpt4 book ai didi

c++ - 如何让编译器在赋值时计算出模板类参数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:22:50 25 4
gpt4 key购买 nike

这是代码。是否可以使最后一行工作?

#include<iostream>
using namespace std;

template <int X, int Y>
class Matrix
{
int matrix[X][Y];
int x,y;
public:
Matrix() : x(X), y(Y) {}
void print() { cout << "x: " << x << " y: " << y << endl; }
};

template < int a, int b, int c>
Matrix<a,c> Multiply (Matrix<a,b>, Matrix<b,c>)
{
Matrix<a,c> tmp;
return tmp;
}

int main()
{
Matrix<2,3> One;
One.print();
Matrix<3,5> Two;
(Multiply(One,Two)).print(); // this works perfect
Matrix Three=Multiply(One,Two); // !! THIS DOESNT WORK
return 0;
}

最佳答案

在 C++11 中你可以使用 auto这样做:

auto Three=Multiply(One,Two);

在当前的 C++ 中,您不能这样做。

避免必须拼出类型名称的一种方法是移动处理 Three 的代码。进入函数模板:

template< int a, int b >
void do_something_with_it(const Matrix<a,b>& One, const Matrix<a,b>& Two)
{
Matrix<a,b> Three = Multiply(One,Two);
// ...
}

int main()
{
Matrix<2,3> One;
One.print();
Matrix<3,5> Two;
do_something_with_it(One,Two);
return 0;
}

编辑: 为您的代码添加一些注释。

  1. 小心 using namespace std; , 它可以导致 very nasty surprises .
  2. 除非您打算使用负维矩阵,否则请使用 unsigned int或者,更恰本地说,std::size_t对于模板参数会更好。
  3. 您不应该在每个拷贝中传递矩阵。 Pass per const reference instead .
  4. Multiply()可以拼写为operator* , 这将允许 Matrix<2,3> Three = One * Two;
  5. print应该将流打印为 std::ostream& .而且我更希望它是一个自由函数而不是成员函数。我会考虑重载 operator<<而不是将其命名为 print .

关于c++ - 如何让编译器在赋值时计算出模板类参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2905329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com