我的任务是实现一个简单的 SVG 生成器。我需要支持 Circle、Polyline 和 Text。这三者至少有 4 个共同的方法: - 设置描边颜色 - 设置填充颜色 - 设置描边宽度 - 到字符串 主要要求之一是支持链接,例如: 折线{}.SetStrokeColor("白色").SetFillColor("黑色")...
我决定实现一个基类 Element,所有其他类都继承自该基类。这个想法是有一个类 Document 来保存添加到文档中的所有元素的 vector 。 基本方法的示例签名:
// source of trouble
Element &SetStrokeColor(const Color &color) {
...
return *this;
}
我的派生类确实调用了这些方法,但问题是这些方法返回对基类 Element 的引用,而不是派生类。
我的问题是是否可以一起用c++实现???
最佳答案
如果您想共享实现并保留类型信息,CRTP 就是您所需要的:
struct ElementBase { };
template <class Concrete>
struct Element : ElementBase {
Concrete &setStrokeWidth(int width) {
// Actual implementation...
(void) width;
return cthis();
}
private:
friend Concrete;
Element() = default;
Concrete &cthis() { return static_cast<Concrete &>(*this); }
Concrete &cthis() const { return static_cast<Concrete const &>(*this); }
};
struct Circle : Element<Circle> {
Circle &SetCircleCenter(int x, int y) {
// Actual implementation...
(void) x;
(void) y;
return *this;
}
};
int main() {
Circle c;
c.setStrokeWidth(4).SetCircleCenter(0, 0);
}
关于c++ - 从基类方法返回对派生类的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423269/