「More C++ Idioms/整数から型(Int-To-Type)」の版間の差分
削除された内容 追加された内容
Electric goat (トーク | 投稿記録) |
現内容を翻訳 |
||
1 行
=<center>整数から型(Int-To-Type)</center>=
===
* コンパイル時に整数定数を型として扱う。
* 整数定数値に基づいて静的な呼び分け(dispatch)を実現する。
===
整数定数ラッパ(Integral constant wrappers)
===
C++ における関数の多重定義は型が異なることに基づいており、コンパイル時整数定数を関数の多重定義の解決に利用することができない。整数定数に基づいて静的な呼び分け(dipatch)を実現する方法が少なくとも 2 つある。一つは [[More C++ Idioms/enable-if|enable-if]] イディオムであり、もう一つが以下で記述する整数から型(Int-To-Type)イディオムである。
===
<source lang="cpp">
21 行
</source>
上記テンプレートはテンプレートのインスタンス化を用いることで異なる値に対して異なる型を作成する。例えば、''Int2Type<5>'' は ''Int2Type<10>'' と異なる型である。さらに、整数のパラメータは関連づけられた定数 ''value'' に保存されている。整数定数それぞれが異なる型を生み出すため、この単純なテンプレートを以下のように整数定数に基づく静的な呼び分け(dispatch)に用いることができる。
''Array'' クラスを固定長の配列をカプセル化するクラスで TR1 にある標準 array クラスによく似たクラスとする。実際には、我々の Array クラスは標準の TR1 array クラスの派生クラスとして実装されており違いは ''sort'' 関数のみである。
性能に対する最適化を達成するため、配列のサイズによってコンパイル時に sort 関数の呼び分け(dispatch)をする。例えば、配列のサイズが 0 あるいは 1 の場合はソートは何もしない。同様に、サイズが 50 より小さな配列は挿入ソートアルゴリズムによってソートされ、より大きな配列はクイックソートアルゴリズムによってソートされる。なぜなら小さなデータサイズに対しては、挿入ソートアルゴリズムの方がクイックソートアルゴリズムよりも効率的である場合が多いからである。このソートアルゴリズムの選択は実行時の ''if'' によって自明に実行可能である点に注意しよう。しかし、以下のように整数から型(Int-To-Type) イディオムによってコンパイル時に同様の効果を得ることができる。
<source lang="cpp">
41 行
{
enum AlgoType { NOOP, INSERTION_SORT, QUICK_SORT };
static const int algo = (N==0) ?
(N==1) ?
(N<50) ?
void sort (Int2Type<NOOP>) { std::cout << "
void sort (Int2Type<INSERTION_SORT>) { std::cout << "
void sort (Int2Type<QUICK_SORT>) { std::cout << "
public:
void sort()
56 行
{
Array<int, 1> a;
a.sort(); //
Array<int, 400> b;
b.sort(); //
}
</source>
利便性を向上するために、''Int2Type'' にいくつか関連する型と定数を定義することができる。例えば、列挙型 ''value'' を型に関連づけられた整数定数を取得するために利用できる。また、''Int2Type<7>::next'' が ''Int2Type<9>::previous'' と同じ型になるような ''next'' と ''previous'' のような他の typedef を他の型を ''順番に'' 探すために利用することができる。
<source lang="cpp">
76 行
</source>
===
* Boost.MPL 中の [http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/integral-constant.html Integral constant wrappers (bool_, int_, long_)]
* [http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/tutorial/representing-dimensions.html Dimensional Analysis]
===
* [[More C++ Idioms/enable-if|enable-if]]
* [[More C++ Idioms/型生成器(Type Generator)|型生成器(Type Generator)]]
=== References ===
[1] [http://www.ddj.com/cpp/184403750 Generic<Programming>: Mappings between Types and Values] -- Andrei Alexandrescu
[[Category:{{BASEPAGENAME}}|{{SUBPAGENAME}}]]▼
<noinclude>
[[en:More C++ Idioms/Int-To-Type]]
</noinclude>
|