将隐式类型提升添加到std :: complex类运算符

时间:2017-11-29 21:55:38

标签: c++ templates inheritance implicit-conversion

我想在对两个复数进行求和时允许隐式转换

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

我尝试实施此处C++ implicit type conversion with template

的建议

我定义了一个std :: complex的派生类,我添加了应该允许隐式转换的friend函数。这是我的代码:

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继承还是在friend函数中继承。 任何帮助将非常感谢,谢谢

编辑:
当operator +的左右参数都是std :: complex时,Omnifarious代码工作得很好。我怎么能允许操作复数+ 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;

它没有编译。 &#34;无法推断出模板参数'U'和#34;
为什么呢?

1 个答案:

答案 0 :(得分:2)

这可能是你想要的:

#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用于&#39; auto&#39; (又名推断)返回类型。对于C ++ 11,您基本上必须在运算符内重复decltype表达式以获得返回类型。