例を使用せずにこの質問にフレーズするのは少し難しいので、ちょっとしたことがあります。boostはどのようにクラスの "オプション"として型のリストを実装していますか?
基本的な例として、boost::intrusive::list
には興味深いテンプレートがいくつかあり、正確にどのように動作しているかを把握するのに苦労しています。クラス仕様は少しのようになります。
template<typename T, class... Options>
class list {
...
};
私の焦点はOptions
パラメータです。まず、バリデーションです。これは、言語によってサポートされているので、C++ 11では「自明」です。そして確かにC++ 03でシミュレートするのは簡単です(最大10個のパラメータ、すべてデフォルトのトークン値を持つことができます)。
は、ここに私の質問です:
Options
は、任意の順序に "オプション" タイプ、の任意の数を取ることができます。たとえば、次のように一体、彼らはすべての異なる組み合わせのためにこの作品を作っているか
typedef list<Foo, constant_time_size<false> > FooList;
または
//This option will configure "list" to use the member hook
typedef member_hook<Foo, list_member_hook<>, &Foo::hook_> MemberHookOption;
//This list will use the member hook
typedef list<Foo, MemberHookOption> FooList;
これは本当にクールです...。同じタイプのオプションを2回渡すとどうなりますか? boost::instrusive::list
のために、可能なオプションは次のとおりです。
base_hook<class Hook>/member_hook<class T, class Hook, Hook T::* PtrToMember>/value_traits<class ValueTraits>
:すべてのこれらのオプションは、(我々は同じTタイプのいくつかのフックを持つことができるので)リストとフックに挿入するタイプのTとの関係を指定します。 member_hookについては少し後で説明し、value_traitsについては、カスタムValueTraitsを持つコンテナのセクションで説明します。オプションが指定されていない場合、コンテナはデフォルトのタグでベースフックを使用するように設定されます。フック(ポインタのタイプ、リンクモードなど)のために設定されたいくつかのオプションは、コンテナに伝播されます。constant_time_size<bool Enabled>
:定数time size()関数がコンテナに対して要求されているかどうかを指定します。これは、侵入型コンテナに、コンテナの現在のサイズを追跡するために追加のメンバを格納するように指示する。デフォルトでは、一定時間サイズが有効化されています。size_type<bool Enabled>
:コンテナのサイズを保持できるタイプを指定します。この型は、list.size()によって返される型と、constant_time_sizeが要求された場合に侵入型コンテナに格納された型になります。ユーザーは通常この型を変更する必要はありませんが、一部のコンテナはstd :: size_tとは異なるsize_typeを持つことができます(たとえば、STLライクなコンテナはそのアロケータによって定義されたsize_typeを使用します)。 Boost.Intrusiveは、サイズの型を指定するコンテナを実装するために使用できます。デフォルトでは、型はstd :: size_tです。
この概念は、タイプの振る舞いの定義をコンパイルすることができます。しかし、あなたが想像しているように、さまざまな組み合わせが複雑になる可能性があります。私はいくつかの魔法を通して、実際のデータ構造に使用できるシンプルな構造体にオプションを正規化していると推測しています。しかし、それはちょうど推測の仕事です: - P
テンプレート引数の減算を使うのは難しくないと思います。 – Cosyn
@Cosyn:これはテンプレート引数の減算とは関係ありません。私はあなたがその質問を誤解しているかもしれないと思います。 –
Boost.Parameterを見てください。これはBoost.Intrusiveが名前付きパラメータを作成するために使用しているものです。 –