我想在对两个复数进行求和时允许隐式转换
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;
为什么呢?
答案 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
表达式以获得返回类型。