13.1.25.6 型付けされていない値の処理

状況によっては、Anyへの型保障インタフェースでは不十分な場合があります。たとえば、データ型がバイナリ形式でファイルから読み取られ、型Anyの値を作成するために使用される状況などです。このような場合、Anyクラスは、コンストラクタに明示的なTypeCodeとジェネリック・ポインタを提供します。

// C++
Any(TypeCode_ptr tc, void *value, Boolean release = FALSE);

コンストラクタは、指定のTypeCode擬似オブジェクト参照を複製します。releaseパラメータがTRUEの場合、Anyオブジェクトは、valueパラメータが指すストレージの所有権を想定します。 せん。valueパラメータがrelease=TRUEの指定でAnyに渡された後は、呼出し側はこのパラメータの存続期間を想定できません。これは、Anyがvalueパラメータをコピーして、ただちに元のポインタを解放する可能性があるためです。releaseパラメータがデフォルトのFALSEの場合、Anyオブジェクトは、valueによって指されるメモリーを呼出し側が管理すると想定します。valueパラメータはNULLポインタでもかまいません。

Anyクラスでは、3つの危険な操作も定義します:

// C++
void replace(
    TypeCode_ptr,
    void *value,
    Boolean release = FALSE
);
TypeCode_ptr type() const;
const void *value() const;

replace関数は、型保障挿入インタフェースで使用不可能な型で使用します。したがって、この関数は前述のコンストラクタに似ています。既存のTypeCodeは解放され、必要に応じて値のストレージの割当てが解除されます。TypeCode関数のパラメータは複製されます。releaseパラメータがTRUEの場合、Anyオブジェクトは、valueパラメータが指すストレージの所有権を想定します。valueパラメータがrelease=TRUEの指定でAny::replace関数に渡された後は、Anyはこのパラメータの存続期間を想定できません。これは、Anyがvalueパラメータをコピーして、ただちに元のポインタを解放する可能性があるためです。releaseパラメータがデフォルトのFALSEの場合、Anyオブジェクトは、値が入っているメモリーを呼出し側が管理すると想定します。replace関数のvalueパラメータはNULLポインタでもかまいません。

ノート:

前述のコンストラクタもreplace関数も型保障ではありません。特に、TypeCodeとvoid*引数の実際の型との一貫性については、実行時にコンパイラは保証しません。一致しないTypeCodeと値でAnyが作成される場合の、ORB実装の動作は定義されません。

type関数は、Anyに関連付けられたTypeCodeにTypeCode_ptr擬似オブジェクト参照を返します。すべてのオブジェクト参照の戻り値と同様に、リファレンスが不要になったときに呼出し側は、それを解放するか、または自動管理を行うためにTypeCode_var変数を割り当てる必要があります。

value関数は、Anyに格納されているデータへのポインタを返します。Anyに関連付けられている値がない場合、value関数はNULLポインタを返します。