我一直缺少 std::complex
中的一些重要功能喜欢添加 std::complex<float>
的能力和一个 std::complex<double>
或类似 1+c
的操作,即 int
之间和 std::complex
.我的想法是派生一个新类 my::complex
来自 std::complex
它只是继承了已经实现的所有内容并添加了其他内容。
为了使代码与使用 std::complex
的函数兼容, 我添加了与 std::complex
的自动转换(以及 my::complex<float>
和 my::complex<double>
之间的自动转换)。
现在像
my::complex<float> c1,c2,c3;
c1 = c2 + c3;
即使我没有实现 operator+
也能正常工作我自己,因为c2
和 c3
被转换到std::complex
, 添加并将结果转换回 my::complex
.我假设编译器可以优化任何实际的复制。
但是,以下内容不起作用:
c1 = 2*(c2+c3)
自 std::complex
不能乘以整数(如果我乘以 double 并有 complex<float>
s,同样的问题)。
我想“好吧,看来我毕竟必须添加 operator+
”,但如果我这样做,我会得到 use of overloaded operator '+' is ambiguous
因为编译器可以在 std::complex
之间和 my::complex
含蓄地。
是否有更好的方法来实现我想要的,或者我是否需要完全重新实现 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;
}
这样,如果你乘以 complex<double>
通过 int
和一个 complex<float>
通过 double
(等)您不必为每个可能的组合复制函数(如果您尝试组合两种没有共同类型的类型,例如 complex<double>
和 std::string
,它根本不会编译).
在这种情况下,填充正文非常简单:我们有两种不同类型的输入,但我们知道(或可以推断)一种与这两种类型兼容的通用类型。我们希望将每个输入转换为该通用类型,并对转换结果执行操作:
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);
}
关于c++ - 有没有一种用额外的运算符扩展类的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496254/