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>{
//...
};