std.typetuple
型タプル(型リストとも呼ばれる)を操作するためのテンプレートです。型タプルに対する操作のうちいくつかは、言語組み込みとなっています。 例えばタプルの n 番目の型を取り出す TL[n] や、 元の型タプルのスライスを新しく取り出す TL[lwr .. upr] などがあります。
References:
Modern C++ Design, Andrei Alexandrescu (Addison-Wesley Professional, 2001) (※訳注: 邦訳あり) の表3.1のアイデアに基づいています Source:
std/typetuple.d
License:
Boost License 1.0. Authors:
Walter Bright
- ゼロ個以上の型の型タプルを作成します
Example:
import std.typetuple; alias TypeTuple!(int, double) TL; int foo(TL td) // int foo(int, double); と同じ { return td[0] + cast(int)td[1]; }
Example:
TypeTuple!(TL, char) // これは次と同等 TypeTuple!(int, double, char)
- ゼロ個以上の型の列 TList のなかで、最初に型 T
が現れたインデックスを返します。
見つからなかった場合は -1 を返します。
Example:
import std.typetuple; import std.stdio; void foo() { writefln("The index of long is ", staticIndexOf!(long, TypeTuple!(int, long, double))); // 出力: The index of long is 1 }
- 後方互換性のために残されています(indexOfの別名です)
- TList から作られる型タプルから、
型 T の最初の出現を(もしあれば)除いたものを返します。
Example:
Erase!(long, int, long, double, char) // 以下に同じ TypeTuple!(int, double, char)
- TList から作られる型タプルから、
型 T の最初の出現をすべて除いたものを返します。
Example:
alias TypeTuple!(int, long, long, int) TL; EraseAll!(long, TL) // 以下に同じ TypeTuple!(int, int)
- TListから重複を全て除いた
型タプルを返します。
Example:
alias TypeTuple!(int, long, long, int, float) TL; NoDuplicates!(TL) // 以下に同じ TypeTuple!(int, long, float)
- TList内の型Tの最初の出現(もしあれば)を型Uに置き換えて作った
型タプルを返します。
Example:
alias TypeTuple!(int, long, long, int, float) TL; Replace!(long, char, TL) // 以下に同じ TypeTuple!(int, char, long, int, float)
- TList内の型Tの出現をすべて型Uに置き換えて作った
型タプルを返します。
Example:
alias TypeTuple!(int, long, long, int, float) TL; ReplaceAll!(long, char, TL) // 以下に同じ TypeTuple!(int, char, char, int, float)
- TList の順番を逆転させた型タプルを作って返します。
Example:
alias TypeTuple!(int, long, long, int, float) TL; Reverse!(TL) // 以下に同じ TypeTuple!(float, int, long, long, int)
- TList の要素のうち、型 T からもっとも深く派生した型を返します。
Tの派生型が見つからなかったときは T 自身を返します。
Example:
class A { } class B : A { } class C : B { } alias TypeTuple!(A, C, B) TL; MostDerived!(Object, TL) x; // xは型Cと宣言される
- 派生クラスより基底クラスが必ずうしろにくるような順序で
TList をソートした型タプルを返します。
Example:
class A { } class B : A { } class C : B { } alias TypeTuple!(A, C, B) TL; DerivedToFront!(TL) // 以下に同じ TypeTuple!(C, B, A)
- TypeTuple!(F[T[0]], F[T[1]], ..., F[T[$ - 1]]) へと評価される
Example:
alias staticMap!(Unqual, int, const int, immutable int) T; static assert(is(T == TypeTuple!(int, int, int)));
- F[T[0]] && F[T[1]] && ... && F[T[$ - 1]] へと評価される
Example:
static assert(!allSatisfy!(isIntegral, int, double)); static assert(allSatisfy!(isIntegral, int, long));
- F[T[0]] || F[T[1]] || ... || F[T[$ - 1]] へと評価される
Example:
static assert(!anySatisfy!(isIntegral, string, double)); static assert(anySatisfy!(isIntegral, int, double));