C++ 如何使子类上的运算符返回子类类型?

C++ 如何使子类上的运算符返回子类类型?,c++,operator-overloading,C++,Operator Overloading,我正在将一段代码从一个几何库转换为另一个几何库。在我当前的代码中,我有很多专门的点类,我更希望有一个模板化的点类。新的模板化操作符有一个重载的加法操作符,定义为 template<typename To> Point<T, N> operator+(const Point<To,N>& p) const; 这就像一个符咒,这个替代品在整个程序中的大多数呼叫站点中都起到了作用。也就是说,除非有算术运算,后跟兼容类提供的函数,比如: IntPoint3

我正在将一段代码从一个几何库转换为另一个几何库。在我当前的代码中,我有很多专门的点类,我更希望有一个模板化的点类。新的模板化操作符有一个重载的加法操作符,定义为

template<typename To>
Point<T, N> operator+(const Point<To,N>& p) const;
这就像一个符咒,这个替代品在整个程序中的大多数呼叫站点中都起到了作用。也就是说,除非有算术运算,后跟兼容类提供的函数,比如:

IntPoint3 index;
// The scalar multiplication results in the Point<int, 3>.
(index * 2).subclass_function();
IntPoint3索引;
//标量乘法的结果是点。
(索引*2).子类_函数();
错误:
未定义
子类函数()

对此,建议的解决方案是什么(即让操作符返回子类类型)

注1:我宁愿编辑Point类,而不是在每个专门的子类中包装算术运算符的所有重载


注2:专用子类不添加状态。

使用奇怪的重复模板模式(CRTP)

基本
模板
点_impl
将其派生类型作为参数

它从其运算符返回派生类型

template<class T, unsigned N, class D>
struct Point_impl {
  D* self() { return static_cast<D*>(this); }
  D const* self() const { return static_cast<D const*>(this); }

  template<typename U, typename D2>
  D operator+(Point_impl<U,N,D2> const& o) const {
    auto retval = *self();
    retval += o;
    return retval;
  }
};
模板
结构点安装{
D*self(){return static_cast(this);}
D const*self()const{return static_cast(this);}
模板
D运算符+(点执行常量和o)常量{
自动检索=*self();
retval+=o;
返回返回;
}
};
然后,您的导出:

struct Bob:Point_impl<int,3,Bob>{
  //...
};
struct Bob:Point\u impl{
//...
};
等等


我发现
self
中的
static\u assert
也是明智的,因为它抓住了一些拼写错误。

我对问题的标题感到困惑。你的问题与
操作符==
有什么关系?很遗憾,你必须重新定义派生类中的所有操作符才能这样做。@VaughnCato他的意思是他有
Base::operator+
返回
Base
,他希望表达式
derived\u a+derived\u b
返回一个
derived
。如果每个
都可以替换
IntPoint3
,那么
就是
IntPoint3
,继承应该是另一种方式。@MattMcNabb:哇,好的。在词汇歧义中迷失了方向。我已经更改了问题的标题。我猜你又在打电话了,或者今天是“节省空间吧日”?;)(你有一个流浪的
)@dyp在做烧烤,是的。不要使用任何自动更正,因为它对代码的影响比我的打字错误更糟糕!
struct Bob:Point_impl<int,3,Bob>{
  //...
};