この記事では、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:コメント
1と
2で同志
burdakovdと
tangroが正しく指摘したように、Javaと.NETでは、このメカニズムのサポートはGenericsにあります。
Java Genericsおよび
.NET Genericsの説明へのリンク。
更新2:ユーザー
suslは、Boostライブラリには
Boost Concept Checkメカニズムがあることを
コメントで正しく指摘しました。
更新3:バルタザール同志は、新しいC ++ 0x標準の概念に関する
状況 、またはむしろそれらの不在について
明らかにしました 。 そして彼は
、Boost Concept Checkプレゼンテーションのスライドへのリンクを提供しました。 彼に感謝します!