C++ 标准::复杂<;双倍>;其他类型的乘法
我有以下C++指令:C++ 标准::复杂<;双倍>;其他类型的乘法,c++,C++,我有以下C++指令: std::complex<double> c(1.0, 1.0); bool b = true; double a = 1.0; int f = 1; double d = a * b; double e = b * c; // this operation (bool x complex) is not available double g = f * c; // this operation (int x complex) is not ava
std::complex<double> c(1.0, 1.0);
bool b = true;
double a = 1.0;
int f = 1;
double d = a * b;
double e = b * c; // this operation (bool x complex) is not available
double g = f * c; // this operation (int x complex) is not available
std::复杂c(1.0,1.0);
布尔b=真;
双a=1.0;
int f=1;
双d=a*b;
双e=b*c;//此操作(布尔x复合体)不可用
双g=f*c;//此操作(int x complex)不可用
请注意,complex
不能与int
相乘,而不能与bool
类型相乘
我在某个地方读到这是用C++ 20标准解决的。但是,与此同时
我如何解决这个问题?
我是否可以重载某些内容,以便编译器理解这些操作
<>我不想把所有的东西都声明为<代码>复合体< />代码,我不想通过函数来传递参数,因为我的目标是使用ARMADILO C++库,它们使用<代码>复数< /代码>来构造它们的复杂矩阵,我希望能够用布尔矩阵来乘一个复杂的矩阵。这就是为什么我不能使用函数,而应该使用某种类型的类扩展/重载。是的,您可以简单地为
操作符*
提供重载,如下所示:
double operator*(bool, std::complex<double>);
double operator*(int, std::complex<double>);
double运算符*(bool,std::complex);
双运算符*(int,std::complex);
显然,您还需要编写定义 就是这样:
complex<double> operator * (const int & a, const complex<double> & b){
if (a != 0)
return complex<double>(b.real() * a, b.imag() * a);
else
return complex<double>(0, 0);
}
complex运算符*(常量int&a、常量complex&b){
如果(a!=0)
返回复数(b.real()*a,b.imag()*a);
其他的
返回复合体(0,0);
}
通过使用此函数,编译器可以理解操作。还用了犰狳C++矩阵的技巧。你能写下其中一个的定义来看看它是如何完成的吗?这取决于你的真实情况。将复数与布尔相乘,从而返回一个double,这意味着什么?这个解决方案只会让编译器满意,但代码是否有意义取决于您。我的目的是,如果bool:return complex,或者return complex(0,0),我更感兴趣的是让std::complex理解我想要的东西的工具,所以试着编写它。看起来已经有了有效的代码:)声明很好;它们基于您提供的使用情况。在刚才给出的示例中,您试图返回bool或
std::complex
。有很多方法可以做到这一点,但我建议在弄清楚如何实现它之前,先考虑一下您要实现的目标。请参阅。不确定为什么要选中a!=0
这里。它是否比零执行产品快?这取决于情况,而且差异可能不显著。如果将大量乘以零或大量乘以非零,由于分支预测的缘故,速度可能会更快。如果不是,则可能会因为分支预测失误而变慢。这里的“很多”很难估计。此外,可能还有其他因素在起作用。无论如何,没有分支会使代码更清晰。