std.boxer
このモジュールは、任意のオブジェクト(値オブジェクトでもヒープオブジェクトでも) を汎用のBox型に変換して、ユーザーが Box の中身を知らずともオブジェクトを運べるようにして、 あとでBoxから元の値を取り出せるようにする機能を提供する型と関数の集まりです。WARNING:
このモジュールは非推奨となりました。新しいコードでは std.variant を使ってください。
Example:
// 整数45をboxに変換 Box b = box(45); // 整数を取り出して、realにキャスト real r = unbox!(real)(b);これが基本的なインターフェイスで、ほとんどの場合、これさえ理解していれば十分です。 指定された型でunboxできなかった場合は、UnboxException例外が投げられます。 上の例で示したように、unboxの際には暗黙変換をかけることができ、 その挙動は普通の型の場合と全く同じです。ですから例えば、int から real へと unbox することは可能ですが、逆に明示的なキャストの必要な real から int への unbox はできません。
これはつまり、int から string を unbox しようとすると、 整数が文字列化されたりはせずに例外が発生するということです。こういう時は一般に、 Boxオブジェクトの toString を呼ぶと欲しい結果が得られるかもしれません。toString は std.string.format に依存します。
Box同士は互いに比較することができ、 連想配列のキーとしても使用できます。
Boxの配列に関する変換関数も用意されています。
Example:
// 引数をboxの配列に変換 Box[] a = boxArray(1, 45.4, "foobar"); // boxの配列を引数配列に戻す TypeInfo[] arg_types; void* arg_data; boxArrayToArguments(a, arg_types, arg_data); // 引数の配列を、別の形式の関数で // boxの配列へと再び変換 a = boxArray(arg_types, arg_data);この機能の使い道の一つは、可変個引数関数をより簡単で頑強に扱う 道具としての使い方です。 "boxArray(arguments, argptr)", を呼んでしまえば、 あとは配列に対する好きな操作を何でも実行できます。 Source:
std/boxer.d
License:
Boost License 1.0 Authors:
Burton Radons BUGS:
- Box.findTypeClass が返す型情報です。エントリの順番が重要です。
- < bool
- < byte, ubyte, short, ushort, int, uint, long, ulong
- < float, double, real
- < cfloat, cdouble, creal
- < ifloat, idouble, ireal
- < Object から派生
- < ポインタ型 (T *)
- < 配列型 type (T [])
- < その他の型。delegate、関数ポインタ、構造体、void、...
- Box は、
(値およびヒープ)オブジェクトを保持する汎用コンテナです。
ユーザーは、任意のオブジェクトをBox化して汎用的に処理し、
あとで元の型に復元することができます。
Boxオブジェクトはbox関数の呼び出しによって作成し、
unboxテンプレートをインスタンス化して値を復元します。
- 格納された値を、指定されたtype型へと例外を投げることなく unbox できるかどうかを返します。
- Boxに格納されたオブジェクトの型情報。
このプロパティの初期値は null で、直接書き換えることはできません。
Returns:
格納されたオブジェクトの型情報
- Boxに格納されたオブジェクトを指すポインタ。
このプロパティの初期値は null で、直接書き換えることはできません。
Returns:
データ配列
- 格納された値を、std.string.format を使用して文字列への変換を試みます。
format関数がサポートしない型が入っていた場合、例外を投げます。
Boxが未初期化の時は、文字列 "" を返します。
- boxと別のboxを比較します。格納された型が違っていた場合、
通常の型システムと同じように、暗黙のキャストを行います。
- boxと別のboxを比較します。格納された型が違っていた場合、
通常の型システムと同じように、暗黙のキャストを行います。
- 値のハッシュ値を返します。
- 関数に渡された一つの引数をBox化します。0個か2個以上の引数が渡された場合、
assert で停止します。
- 明示的に定義されたオブジェクトをBox化します。type に null は指定できません。data には、
type のサイズがゼロの時以外は
null を指定できません。data はコピーされます。
- 引数のリストをBoxのリストに変換します。
- 引数のリストをBoxのリストに変換します。
- Boxのリストを引数のリストに変換します。
- unboxで指定された型へのキャストに失敗した場合、
このクラスの例外を投げます。
- ユーザーがunboxを試みたBoxオブジェクト
- ユーザがunbox先に指定した型
- this(Box object, TypeInfo outputType);
- 以上の二つのパラメタを設定し、
"Could not unbox from type ... to ... ." という形式のエラー文字列を生成します。
- 実数型用の汎用unboxer
- 整数型用の汎用unboxer
- 複素数型用の汎用unboxer
- 虚数型用の汎用unboxer
- unbox テンプレートは型引数を一つ取り、
Boxオブジェクトを引数の型に変換する関数を作ります。
使用するには、欲しい返値型で関数テンプレートをインスタンス化し、 できた関数に変換したいBoxを渡して呼び出します。 この関数は、必要ならば通常の型システムと同様の暗黙変換を行います。 例えば、Box化されたbyteをintへ変換することはありますが、 Box化されたfloatをshortへ変換することはありません。
Throws:
変換できない場合は UnboxException を投げます。
Example:
Box b = box(4.5); bit u = unboxable!(real)(b); // trueになる real r = unbox!(real)(b); Box y = box(4); int x = unbox!(int) (y);
- 指定された型へとunbox可能かどうかを返します。この結果が
false の時は、unboxしようとすると UnboxException 例外が発生します。