gpt4 book ai didi

c++ - 如何为模板化类声明类外二元运算符?

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:26 24 4
gpt4 key购买 nike

<分区>

我有一种情况,为了方便起见,我有一些数学运算可以重载。

但其中一些对其他类型进行操作。

喜欢

vec3<type> * type

type * vec3<type>

标量右参数的一种方法是:

template<class T, class SubT>
class Vec3 {
// this is fine, ie: works
SubT operator *(const T &val) {
return(SubT(x*val,y*val,z*val));
}
};

我读到最好只实现 *、+、-、/等“类外”的运算符,或者让编译器从类中的 += 版本中推断出一些东西。

  • 与在类里面实现 + 相比,这是最佳选择吗?
  • 如何在左侧参数是另一种类型的情况下进行反向操作?

即在我的特定情况下,模板化运算符有两个模板类型参数。一个是元素的类型,另一个是模板为其实现方法的父类(super class)。

template<class T, class SubT>
SubT operator *(const T &a, const Vec3Base<T, B> &b) {
return(b * a);
}

无论如何希望你能实现我的愿望,问题是如何正确地做到这一点:)

比如我是否只需要制作一种类型?即: vector 类型,然后从中获取元素类型作为 typedef ??

template<class VT>
VT::SubT operator*(const VT::ElemT &a, const VT &v) {
return(v * a);
}

我是否也应该用其他方式实现而不是在类里面而是“类外”:

template<class VT>
VT::SubT operator*(const VT &a, const VT::ElemT &b ) {
return(VT::SubT(a.x*b,a.y*b,a.z*b));
}

好吧,我确实阅读了习语中运算符重载问题的大部分答案。

我确实回答了很多事情。但不包括模板的 ramafacations 和模板声明在这些模板的子类中使用的运算符。

对于必须选择将它们实现为成员函数或非成员函数的所有运算符,请使用以下经验法则来决定:

这对我想知道无论是在课外还是在类里面实现的最佳方式有所帮助。

If it is a unary operator, implement it as a member function.
If a binary operator treats both operands equally (it leaves them unchanged), implement this operator as a non-member function.
If a binary operator does not treat both of its operands equally (usually it will change its left operand), it might be useful to make

it a member function of its left operand’s type, if it has to access the operand's private parts.

我想知道是否存在关于模板优先级高于另一个的问题。我发现如果在模板中声明了一个运算符,并且它是至少在 MS 编译器中继承它的运算符的子类的父类(super class),它将优先查看全局运算符而不是父类(super class)中的运算符。可恶的 !!!类似的问题发生在 clang 和 gcc 上。

我确实发现我真的必须在同一级别声明所有可能的冲突运算符,以便重载解析按预期工作。即:所有在子类的同一个父类(super class)中,如果在父类(super class)的父类(super class)中声明了 poerators,它们有时会被忽略,似乎如果有一些任性的转换为更高优先级的重载之一提供参数(啊啊)。

看来此时我已经解决了所有编译问题 - 现在让它链接哈哈哈!!

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