2012-01-06 19 views
13

boost::anyboost::any_castの固有の利点には、void*dynamic_castを使用するとどのような利点がありますか?なぜ `boost :: any`は` void * `より優れていますか?

+9

あなたは 'void *'から 'dynamic_cast'を書くことはできません。 –

+0

@ArmenTsirunyan私はいつもやったと思っていましたが、試したことはありませんでした。 –

+1

@PaulManta Armenのコメントに関して、あなたはこの質問を見ることができますhttp://stackoverflow.com/questions/6771998/dynamic-cast-of-void –

答えて

21

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 

、あなたはvoid*からdynamic_castすることはできません。あなただけのポインタや参照から、少なくとも1つの仮想機能(別名多型タイプ)を持つクラス型にすることができますdynamic_cast

+0

ええ、それは静的なキャストで、ダイナミックではありませんキャスト。'void *'で 'dynamic_cast'を使うことができないというあなたのコメントは良い答えでした。あるいは、あなたがしなくても 'static_cast'を使用することを止めるものは何もないというあなたの主張でしたか? :) –

+0

@Paul:その部分を私の答えに加えました –

5

これは、ブーストの参照が言うことである:

それは、任意の値タイプのコピーをサポートし、安全確認その値が厳密にその型に反して値を抽出する。

どちらもvoid*で行うことはできません。あなたのためのチェックはありませんし、あなたはそれをキャストすることができます自分自身を知る必要があります。

私はdynamic_castとは全く関係がありませんので、全く入力しないと思います。

13

boost::any呼び出しデストラクタ:

{ 
    boost::any x = std::string("Hello, world"); 
    x = std::wstring(L"Goodbye"); // string::~string called here 
} // wstring::~wstring called here 
6

は何とか誰もがその後押しを言及していない::任意の<>のvoid *ポインタであるとして、値型、として機能します。つまり、<>にはANYサイズのANYオブジェクトを格納できます。一旦格納されると、任意の場所にある任意の<型の変数を渡すことができます。それはそれ自身の上に生きている。

一方、void *はポインタサイズであるため、sizeof(自分のデータ)< = sizeof(void *)またはvoid *が格納されている実際のデータへのポインタにすぎないことを確認する必要がありますどこか別の場所。しかし、その場合は、<とはまったく異なります。なぜなら、ここでは "どこか他のもの"を心配し、void *が有効である限り有効であることを確認する必要があるからです。特に、マルチスレッドアプリケーション。

プラス<は非常に型の安全性が高いので、必要なものはすべて保存しますが、戻す唯一の方法は正確なタイプを知ることです。失敗すると、 APIにはの符号なしのintがあり、コードにはが異なる種類として扱われます。 void *を使用すると、あなたがそれで必要なことを行えるようになります。ヒープや初期化されていないメモリの読み書きを開始しても、それはあなたを止めることはありません。

関連する問題