Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种好方法可以使用附加运算符扩展类?_C++_Inheritance_Operator Overloading - Fatal编程技术网

C++ 有没有一种好方法可以使用附加运算符扩展类?

C++ 有没有一种好方法可以使用附加运算符扩展类?,c++,inheritance,operator-overloading,C++,Inheritance,Operator Overloading,我一直缺少std::complex中的一些重要功能,比如添加std::complex和std::complex的功能,或者类似1+c的操作,即在int和std::complex之间。我的想法是从std::complex派生一个新类My::complex,它只继承已经实现的所有内容并添加其他内容 为了使代码与使用std::complex的函数兼容,我添加了与std::complex之间的自动转换(以及my::complex和my::complex之间的自动转换) 现在大概 my::complex&

我一直缺少
std::complex
中的一些重要功能,比如添加
std::complex
std::complex
的功能,或者类似
1+c
的操作,即在
int
std::complex
之间。我的想法是从
std::complex
派生一个新类
My::complex
,它只继承已经实现的所有内容并添加其他内容

为了使代码与使用
std::complex
的函数兼容,我添加了与
std::complex
之间的自动转换(以及
my::complex
my::complex
之间的自动转换)

现在大概

my::complex<float> c1,c2,c3;
c1 = c2 + c3;
因为
std::complex
不能与整数相乘(如果我与double相乘并具有
complex
s,则会出现相同的问题)

我想“好吧,看来我总得添加
操作符+
”,但如果我这样做,我会发现
重载操作符“+”的使用是不明确的,因为编译器可以隐式地介于
std::complex
my::complex
之间


有没有更好的方法来实现我想要的,或者我需要完全重新实现
std::complex
中的所有内容并放弃继承?

对于添加不同类型的复数和其他运算符,我将使用自由函数

std::complex<double> operator? (std::complex<double> a,std::complex<float> b){
    std::complex<double> result;
    // implement ?
    return result;
}
std::complex<double> operator? (std::complex<float> a,std::complex<double> b){
    return b ? a;
}
std::复杂运算符?(标准::复合物a,标准::复合物b){
复杂结果;
//实施?
返回结果;
}
复杂运算符?(标准::复合物a,标准::复合物b){
返回b?a;
}
其中
是您想要的操作员的placehold。请注意,这是一个C++11之前的解决方案,要了解更好的方法,请参阅


对于向复数中添加数字,如在
1+c
中,我不会努力编写运算符,而是简单地使用
c+1
(实际上,我不确定这是否适用于
std::complex
,但如果不适用,我会感到惊讶)

将这些重载添加为自由函数可能是完成这项工作的最佳方法。但是,我不会为每一对可能的操作数类型分别编写一个硬编码的操作数,这会很快变得很乏味

相反,您无疑希望编写一个模板函数来处理任何一对操作数类型。关于这个一般顺序:

template <class T, class U>
auto operator*(T const &a, U const &b) -> typename std::common_type<T, U>::type 
{
    // code to produce the equivalent of: return a * b;
}

不确定,但你尝试过<代码> C1=(C2+C3)*2 < /Cord>?再次不确定,但是添加<代码> STD::复杂< /COD> >代码> STD::复合< /代码>我认为你不需要继承,但是你可以实现操作符作为自由函数自动类型转换是C++最坏、最危险的错误特性。这就是为什么转换构造函数在
std::complex
中是显式的。逆流而上,风险自负。@n.m.我看你是键盘公司的一个难题,他们想让每个人都把键盘磨坏,所以他们不得不买更多。语法是可用语言的重要组成部分,隐式类型转换是生成密集但可读代码的重要组成部分。@xaxxon这实际上是我的错误,只有狭窄的转换是显式的。不管怎样,<代码>操作符+ < /代码>等都不考虑隐式转换,所以不允许混合型算术,这是一件好事。如果您不同意,请先向标准委员会咨询,然后再向我咨询。我现在对我的回答感到有点惭愧;)你不是在实现操作符a*b吗?这应该是怎么回事?@MikeMB:对不起,我想我没有说出来,但身体基本上只是作为占位符的伪代码。也就是说,在这里,你可以做任何需要的事情,将两项相乘,然后返回结果。我已经进行了编辑,使其更加明显,并添加了一个实际的实现。也许我不明白这是如何工作的,但是std::complex和int如何有一个共同的类型?另外,我不知道本例中的->语法。这是特定于C++11的吗?我不能在我的代码中使用它unfortunately@ViktorDick:是,尾随返回类型特定于C++11。在C++11中添加了相当多的功能。如果你真的需要在没有C++11的情况下生存(为什么?),Boost可能有一些粗略的等价物,可以在较旧的编译器中使用(例如,如果内存可用,那么它们在被添加到标准之前就有一个
通用类型)。
C+1
1+C
都没有定义,如果
C
复杂的。如果
c
complex
,则它们都是定义的。
template <class T, class U>
auto operator*(T const &a, U const &b) -> typename std::common_type<T, U>::type 
{
    // code to produce the equivalent of: return a * b;
}
template <class T, class U>
auto operator*(T const &a, U const &b) -> typename std::common_type<T, U>::type 
{
    using ret_type = typename std::common_type<T, U>::type;
    return ret_type(a) * ret_type(b);
}