C ++での型グループ化の概念

この記事では、IGroupテンプレートクラスを使用して実装されるC ++で型をグループ化する方法について説明します。 タイプをグループ化する方法により、オブジェクトに対して複数のタイプを指定できます。 たとえば、2つのオブジェクトインターフェイスを指定できます。



一般に、この手法は言語構成体になる可能性がありますが、どのPLでも見られません (GenericsとBoost、さらにはSTLについても説明してくれたコメントで)。 したがって、C ++で実装しようとするのは面白かったです。







いくつかのインターフェースがあるとします:

1)飛行可能

2)ひどい

3)アヒル



一部のタイプはこれらのインターフェースをすべて一度に実装し、一部のタイプはインターフェースの一部のみを実装します。 特定のメソッドが、飛ぶことができるオブジェクト(飛べる)と揺れることができるオブジェクト(quackable)でのみ機能することを示す方法



この問題については、「Design Patterns」という本(Bates B.、Sierra K.、Freeman E.、Freeman E.)で詳しく説明されています。 自体へのリンク。 出版社のサイトには、インターフェースの分離の問題の詳細な説明を含む本の必要な断片があります。



パラメーターの数が異なる3つの特殊化を備えた次のテンプレートを提供します。







テンプレートの使用は次のように想定されています。



1)インターフェースのグループを実装するには:







2)メソッドパラメータに必要なインターフェイスをリストするには:







したがって、パラメータタイプは、オブジェクトが実装する必要があるインターフェイスを明示的にリストします。



上記のIGroupテンプレートクラスには1つの重大な欠点があります-型の列挙の順序は不可欠です。 この機能を排除するには、IGroup継承の階乗倍数と型数をリストする必要があります。 つまり、 N(N-1)の量で、タイプのすべての可能な組み合わせではなく、それらのさまざまな配置を示します。 (N-1)でNからの(N-1)オブジェクトの配置が可能 組み合わせの数倍。



3つのパラメーターのサンプルコード:







完全なサンプルコードはこちら: http : //codepad.org/ONI6uXjI



もちろん、5番目と6番目のパラメーターを使用してIGroupのコードを手動で作成しないでください。この千行のコードを生成するにはスクリプトが必要です。 完全に使用するには、スマートポイントで十分な作業がありません。 先日試してみますが、「スマート」ポインターをキャストしても問題はないようです。



更新1:

コメント12で同志burdakovdtangroが正しく指摘したように、Javaと.NETでは、このメカニズムのサポートはGenericsにあります。 Java Genericsおよび.NET Genericsの説明へのリンク。



更新2:

ユーザーsuslは、BoostライブラリにはBoost Concept Checkメカニズムがあることをコメントで正しく指摘しました。



更新3:

バルタザール同志は、新しいC ++ 0x標準の概念に関する状況 、またはむしろそれらの不在について明らかにしました 。 そして彼は、Boost Concept Checkプレゼンテーションのスライドへのリンクを提供しました。 彼に感謝します!



All Articles