Inheritance Without Pointers DRANK Expressive code in C++ fluentcpp.com 4 years ago Related Topics: arrow_back open_in_new Open page https://www.fluentcpp.com/2021/01/29/inheritance-without-pointers/ 1 comments Ryo Suzuki @Reputeless 3 years ago std::any をうまく使えば、ポインタを登場させずに値のセマンティクスで継承を使えるというテクニックの紹介記事 サイズが小さいオブジェクトなら heap allocation を回避できる (参考記事: https://kenkyu-note.hatenablog.com/entry/2021/01/22/231454) 利点もあるが、std::any のオーバーヘッドは要考慮 「値のセマンティクスで使える」とは、std::unique_ptr<Base>, std::make_unique<Derived>() のようなことはせず、以下のサンプルのように値のような感覚で扱えるということ struct IDrawable { virtual ~IDrawable() = default; virtual void draw() const = 0; }; struct Rect : IDrawable { void draw() const override { std::cout << "Rect\n"; } }; struct Circle : IDrawable { void draw() const override { std::cout << "Circle\n"; } }; using Drawable = Implementation<IDrawable>; Drawable MakeRect(){ return Rect{}; } int main() { std::vector<Drawable> calculators; calculators.push_back(Rect{}); calculators.push_back(Circle{}); Circle c; calculators.push_back(c); calculators.push_back(MakeRect()); calculators[0]->draw(); calculators[1]->draw(); calculators[2]->draw(); calculators[3]->draw(); }
Ryo Suzuki @Reputeless 3 years ago std::any をうまく使えば、ポインタを登場させずに値のセマンティクスで継承を使えるというテクニックの紹介記事 サイズが小さいオブジェクトなら heap allocation を回避できる (参考記事: https://kenkyu-note.hatenablog.com/entry/2021/01/22/231454) 利点もあるが、std::any のオーバーヘッドは要考慮 「値のセマンティクスで使える」とは、std::unique_ptr<Base>, std::make_unique<Derived>() のようなことはせず、以下のサンプルのように値のような感覚で扱えるということ struct IDrawable { virtual ~IDrawable() = default; virtual void draw() const = 0; }; struct Rect : IDrawable { void draw() const override { std::cout << "Rect\n"; } }; struct Circle : IDrawable { void draw() const override { std::cout << "Circle\n"; } }; using Drawable = Implementation<IDrawable>; Drawable MakeRect(){ return Rect{}; } int main() { std::vector<Drawable> calculators; calculators.push_back(Rect{}); calculators.push_back(Circle{}); Circle c; calculators.push_back(c); calculators.push_back(MakeRect()); calculators[0]->draw(); calculators[1]->draw(); calculators[2]->draw(); calculators[3]->draw(); }
std::any
をうまく使えば、ポインタを登場させずに値のセマンティクスで継承を使えるというテクニックの紹介記事std::any
のオーバーヘッドは要考慮std::unique_ptr<Base>
,std::make_unique<Derived>()
のようなことはせず、以下のサンプルのように値のような感覚で扱えるということstruct IDrawable { virtual ~IDrawable() = default; virtual void draw() const = 0; }; struct Rect : IDrawable { void draw() const override { std::cout << "Rect\n"; } }; struct Circle : IDrawable { void draw() const override { std::cout << "Circle\n"; } }; using Drawable = Implementation<IDrawable>; Drawable MakeRect(){ return Rect{}; } int main() { std::vector<Drawable> calculators; calculators.push_back(Rect{}); calculators.push_back(Circle{}); Circle c; calculators.push_back(c); calculators.push_back(MakeRect()); calculators[0]->draw(); calculators[1]->draw(); calculators[2]->draw(); calculators[3]->draw(); }