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

我有以下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 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
这里。它是否比零执行产品快?这取决于情况,而且差异可能不显著。如果将大量乘以零或大量乘以非零,由于分支预测的缘故,速度可能会更快。如果不是,则可能会因为分支预测失误而变慢。这里的“很多”很难估计。此外,可能还有其他因素在起作用。无论如何,没有分支会使代码更清晰。