gpt4 book ai didi

c++ - 有没有一种用额外的运算符扩展类的好方法?

转载 作者:可可西里 更新时间:2023-11-01 16:34:15 26 4
gpt4 key购买 nike

我一直缺少 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+ 也能正常工作我自己,因为c2c3被转换到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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com