boost::any
とboost::any_cast
の固有の利点には、void*
とdynamic_cast
を使用するとどのような利点がありますか?なぜ `boost :: any`は` void * `より優れていますか?
答えて
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
ええ、それは静的なキャストで、ダイナミックではありませんキャスト。'void *'で 'dynamic_cast'を使うことができないというあなたのコメントは良い答えでした。あるいは、あなたがしなくても 'static_cast'を使用することを止めるものは何もないというあなたの主張でしたか? :) –
@Paul:その部分を私の答えに加えました –
これは、ブーストの参照が言うことである:
それは、任意の値タイプのコピーをサポートし、安全確認その値が厳密にその型に反して値を抽出する。
どちらもvoid*
で行うことはできません。あなたのためのチェックはありませんし、あなたはそれをキャストすることができます自分自身を知る必要があります。
私はdynamic_cast
とは全く関係がありませんので、全く入力しないと思います。
boost::any
呼び出しデストラクタ:
{
boost::any x = std::string("Hello, world");
x = std::wstring(L"Goodbye"); // string::~string called here
} // wstring::~wstring called here
は何とか誰もがその後押しを言及していない::任意の<>のvoid *ポインタであるとして、値型、として機能します。つまり、<>にはANYサイズのANYオブジェクトを格納できます。一旦格納されると、任意の場所にある任意の<型の変数を渡すことができます。それはそれ自身の上に生きている。
一方、void *はポインタサイズであるため、sizeof(自分のデータ)< = sizeof(void *)またはvoid *が格納されている実際のデータへのポインタにすぎないことを確認する必要がありますどこか別の場所。しかし、その場合は、<とはまったく異なります。なぜなら、ここでは "どこか他のもの"を心配し、void *が有効である限り有効であることを確認する必要があるからです。特に、マルチスレッドアプリケーション。
プラス<は非常に型の安全性が高いので、必要なものはすべて保存しますが、戻す唯一の方法は正確なタイプを知ることです。失敗すると、 APIにはの符号なしのintがあり、コードにはのが異なる種類として扱われます。 void *を使用すると、あなたがそれで必要なことを行えるようになります。ヒープや初期化されていないメモリの読み書きを開始しても、それはあなたを止めることはありません。
- 1. boost :: anyとtemplates
- 2. なぜ私のスキャッタローンの性能はVc SIMDより優れていますか?
- 3. なぜプロトコルは迅速にクラスより優れていますか?
- 4. なぜ算術+はテキストよりも優先されますか?
- 5. visitor pattern for boost :: any
- 6. Boost :: any and polymorphism
- 7. ノンクラスターアプリはnodejsのクラスターアプリより優れているのはなぜですか?
- 8. boost :: any/std :: anyは小さなオブジェクトをインプレースに格納しますか?
- 9. なぜassertは(void)0と定義されていますか?
- 10. なぜreturn型Observableがプリミティブ型より優れていますか?
- 11. なぜレキシカルスコープがコンパイラより優先されますか?
- 12. "constexpr if"はswitch文よりも優れていますか?
- 13. コンパイラはインラインよりもインラインで優れていますか?
- 14. シグナルとスロットは単純な古いコールバックよりも優れているのはなぜですか?
- 15. 優先度キューを表すヒープがバイナリツリーより優れているのはなぜですか?
- 16. なぜmergesortはリンクリストの方が優れていますか?
- 17. このVBAのクラッシュはなぜ優れていますか?
- 18. ブーストプリプロセッサを使用したBoost Any Boostバリアント
- 19. AVLツリーはいつハッシュテーブルより優れていますか?
- 20. siftDownがsiftUpより優れている場合、なぜそれを持っていますか?
- 21. とLAMP + LAMPPはXAMPPよりも優れていますか?
- 22. ゴールデンセクション検索はバイナリ検索より優れていますか?
- 23. PHP:静的は非静的より優れていますか?
- 24. javax.xml.soapはapache cxfよりも優れていますか?
- 25. <table>よりもレイアウトは優れていますか?
- 26. CSSはページレイアウト用のテーブルよりも優れていますか?
- 27. RTMPは彗星より優れていますか?
- 28. この場合、LFUはLRUより優れていますか?
- 29. なぜFileChannelはMemoryMappedBufferよりも優れたパフォーマンスを示しますか?
- 30. boost :: variantとvoid *ポインタ
あなたは 'void *'から 'dynamic_cast'を書くことはできません。 –
@ArmenTsirunyan私はいつもやったと思っていましたが、試したことはありませんでした。 –
@PaulManta Armenのコメントに関して、あなたはこの質問を見ることができますhttp://stackoverflow.com/questions/6771998/dynamic-cast-of-void –