Inheritance Without Pointers
DRANK

Expressive code in C++

fluentcpp.com
Related Topics:
1 comments
    • 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();
    }