拡張性とカスタマイゼーション
ここでは,Yuライブラリにおける拡張性について規定する.
基本方針
Yuライブラリは,意味論的な適切さを損なわない範囲で,特定の具体的な型に依存しない拡張可能なインタフェースを提供する.ここでは拡張可能性の実現手段の詳細は規定しないが,コンセプトによる制約を与えることを中心とし,その詳細は各サブライブラリの仕様で規定する.
カスタマイゼーションポイント
カスタマイゼーションは,ユーザ定義型をYuライブラリが提供する意味論の体系へ統合するための手段として位置付ける.これは拡張可能性そのものを提供する機構ではない.
カスタマイゼーションの対象と方法について,以下の通りに定める.なお,既存文化で合意された異なる方法がある場合は,それを優先する.
値および動作
値及び動作のカスタマイズは,tag_invoke設計に基づいたCPOによって行う.
メンバ関数やフリー関数に対するADLを用いた設計では,拡張点として意図されていないものを誤検出する可能性があり,それを避けて非侵入的にカスタマイズすることを可能にするため,tag_invoke設計を用いる.
コンパイル時定数
コンパイル時定数のカスタマイズは,constexpr変数テンプレートの特殊化によって行う. 値をカスタマイズする拡張点が,意味論または構文的な制約により,コンパイル時定数である必要があるとき,この方法を用いる.
constexpr変数テンプレートの特殊化において,ユーザがその変数テンプレートの型を変更しないことは事前条件であり検査は行わず,違反した場合の動作は保障しない.
型
型のカスタマイズは,テンプレートパラメータによる指定または,クラステンプレートの特殊化でのメンバ型エイリアスの定義によって行う. 型のカスタマイズは,意味論的に必要な場合のみ行われるべきであり,コンパイル時の分岐の手段として用いられてはならない.