简单的方法将隐式类型促销添加到std ::复杂类操作员

Simple way to add implicit type promotion to the std::complex class operators

本文关键字:std 添加 复杂 操作员 方法 类型 简单      更新时间:2023-10-16

我想允许在两个复数时允许隐式转换

std::complex<double> a; std::complex<long double> b;
auto c = a+b;

我尝试在此处实现C 隐式类型转换使用模板

我定义了一个派生的STD :: Complex,我添加了应该允许隐式转换的朋友函数。这是我的代码:

template <typename T> class Complex : private std::complex<T> {  
friend Complex operator+ (Complex const &lhs, Complex const &rhs) return Complex(); };
int main(){  
Complex<double> C1; Complex<long double> C2;
auto Sum = C1+C2;
return(0); }

我不明白问题是在STD :: Complex的继承中还是在朋友函数中。任何帮助将不胜感激,谢谢

编辑:
当操作员的左右参数 均为std ::复杂时,全果代码效果很好。我还能允许操作复杂 int?
这是我的尝试:

template <typename T, typename U>  
auto operator +(const ::std::complex<T> &a,    std::enable_if_t<std::is_arithmetic<U>::value, U>  &b) 
{
typedef decltype(::std::declval<T>() + ::std::declval<U>()) comcomp_t;
typedef ::std::complex<comcomp_t> result_t;
return ::std::operator +(result_t{a}, result_t{b});
}

但是,当我尝试时:

int i=1;
auto sum = C1+i;

它不编译。"无法推断模板参数'u’"
为什么?

这可能是您想要的:

#include <complex>
#include <utility> // declval
template <typename T, typename U>
auto operator +(const ::std::complex<T> &a, ::std::complex<U> &b)
{
    typedef decltype(::std::declval<T>() + ::std::declval<U>()) comcomp_t;
    typedef ::std::complex<comcomp_t> result_t;
    return ::std::operator +(result_t{a}, result_t{b});
}
auto test()
{
    using ::std::complex;
    complex<double> x{0, 0};
    complex<long double> y{0, 0};
    return x+y;
}

这需要"自动"(又名推论)返回类型的C 14。对于C 11,您基本上必须重复返回类型的操作员内部的decltype表达式。