とを使用することよりもboost::any
、 とboost::any_cast
が提供する固有の利点は何ですか?void*
dynamic_cast
4 に答える
利点は、boost::any
よりもタイプセーフであることvoid*
です。
例えば
int i = 5;
void* p = &i;
static_cast<double*>(p); //Compiler doesn't complain. Undefined Behavior.
boost::any a;
a = i;
boost::any_cast<double>(a); //throws, which is good
あなたのコメントに関しては、dynamic_cast
からはできませんvoid*
。dynamic_cast
少なくとも 1 つの仮想関数 (ポリモーフィック型) を持つクラス型へのポインターと参照からのみ可能です。
boost::any
デストラクタを呼び出します:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
どういうわけか、boost :: any <>が値型として機能することについては誰も言及していませんが、void*はポインタです。つまり、any<>は任意のサイズの任意のオブジェクトを格納できます。保存したら、任意の<>タイプの変数を任意の場所に渡すことができます。それはそれ自身で生きています。
一方、void *はポインタサイズであるため、sizeof(データ)<= sizeof(void *)であるか、void*が別の場所に格納されている実際のデータへのポインタにすぎないことを確認する必要があります。ただし、その場合は、他の<>とはまったく異なります。これは、「どこか別の場所」について心配し、void *が有効である限り有効であるようにする必要があるためです。これは、特にマルチスレッドアプリケーションでは、問題になることがあります。 。
さらに、他の人が言及しているように、<>は非常にタイプセーフであり、必要なものをすべて保存しますが、それを取り戻す唯一の方法は、正確なタイプを知ることです。 intとあなたのコードがintを望んでいるのは異なるタイプとして扱われます)。void *を使用すると、必要な処理を実行できます。ヒープや初期化されていないメモリの読み取りや舗装を開始しても、停止したり、実行していることを通知したりすることはありません。
これは、ブーストのリファレンスが言うことです:
任意の値タイプのコピーと、そのタイプに対して厳密にその値の安全なチェック付き抽出をサポートします。
どちらも . では実行できませんvoid*
。チェックはなく、何にキャストできるかを自分で知る必要があります。
dynamic_cast
どちらとも直接関係がないので、まったく関係ないと思います。