最終更新日時:
が更新

履歴 編集

void_cast

Motivation

C++は、2つの関連したタイプの間で実行時でポインターをキャストするために、オペレーターdynamic_cast<T>(U * u)をもっています。

しかし、これが利用可能なのは、ポリモーフィックな関係にあるクラス間だけです。

つまり、これを使うためには、対象となるクラスが少なくとも1つの仮想関数を持っている必要があります。

ポインターのserializatonをそのようなクラスだけに制限することは、serializationライブラリの適用可能性を制限することにつながります。

Usage

以下の関数が、void_cast.hppにて定義されています。これらは、boost::serialization名前空間で宣言されています。

template<class Derived, class Base>
const void_cast_detail::void_caster &
void_cast_register(
    Derived const * derived = NULL,
    Base * const base = NULL
);

この関数は、1対の関連したタイプを『登録』します。

これは、DerivedBBBから直接導出するための情報をグローバルなテーブルに保存します。

この『登録』は、プログラムのどこでも実行することができます。

pre-runtimeにビルドされるテーブルは、プログラムの他のどの場所でも利用できます。

訳注:他の、とは、pre-runtimeのビルド中は除くという意味であろう

隣接したbase/derivedペアだけは、登録する必要があります。

void_cast_register<A, B>();
void_cast_register<B, C>();

を登録すれば、自動的にACにアップキャスト可能になります。逆(CからAへのダウンキャスト)も同様です。

void *
void_upcast(
   extended_type_info const & derived_type,
   extended_type_info const & base_type,
   void * const t 
);

void *
void_downcast(
   extended_type_info const & derived_type,
   extended_type_info const & base_type,
   void * const t 
);

これらの関数は、あるタイプからもう一つのタイプにvoidポインタをキャストします。

変換元と変換先タイプは、対応するextended_type_infoレコードを参照することで指定されます。

訳注:原文は以下の通りだが、definitionはdestinationの誤りと考えて訳している

The source and destination types are specified by passing references to the corresponding extended_type_info records.

void_cast_registerで登録されていないタイプ間のキャストは、boost::archive::archive_exception例外を投げます。その際のexception_codeは、unregistered_castとなります。