はじめに (対象読者・この記事でわかること)
この記事は、C++のテンプレートメタプログラミング経験があり、Swiftでも同様のダックタイピングを実現したいと考えている中級者以上のプログラマーを対象にしています。 この記事を読むことで、Swiftが静的型付けを第一に設計されている理由、C++テンプレートのような「構造的部分型(structural subtyping)」がない背景、そして代わりとなるプロトコル指向・存在論的(opaque)型・ジェネリクスを組み合わせた安全で拡張可能な設計パターンを身につけることができます。 C++のSFINAEやコンセプト(C++20)を使いこなしてきた方ほど「Swiftではもっとシンプルに書ける」ことに気づけるはずです。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 - C++でのテンプレートクラス/関数テンプレートの定義・使用経験 - Swiftの基本文法(クラス、構造体、プロトコル、ジェネリクス) - 静的型付け言語におけるダックタイピングと構造的部分型の違い
Swiftには「構造的部分型」がない理由
C++のテンプレートは、インスタンス化された時点で「要求されたメンバが存在すればなんでもOK」という構造的部分型(structural subtyping)を実現します。例えば次のようなコードは、Tがsize()メソッドを持っていれば任意の型で動作します。
Cpptemplate <class T> auto count(const T& c) { return c.size(); }
一方、Swiftは名前付き型(nominal typing) を採用しており、プロトコルに明示的に適合(conform)させるまではメンバが存在しても呼び出せません。これは「型安全性」と「コンパイル高速化」「ABI安定性」を両立するための設計選択です。Swiftコンパイラはモジュール越しのインタフェースを事前に決定できるため、テンプレ
