C++は、であり、静的にはです。 boost::any
のタイプはランタイムの値です。任意の特定のany
は任意のタイプを持つことができます。それはちょっとのポイントです。
コンパイル時間の値でなければならないため、any::type_value
はありません。 any
は実行時構成です。
この考えてみましょう:どのような種類の
void TakeAnAny(boost::any a)
{
a::type_value& i2 = any_cast<a::type_value &>(a);
}
がany::type_value
あるの? TakeAnAny
と電話番号のいずれかをと呼ぶのは合法です。 any::type_value
が縮小できる単一のコンパイル時型はありません。したがって、コンパイラが型を決定する方法はありません。 C++は静的に型付けされているので、あなたはホースしています。
いずれのタイプの最終的な目的はタイプ消去です。私はいくつかの価値があります。そして私はそれを他の機能に渡したいと思います。このプロセスは、いくつかの異なる通信レイヤーを経由します。しかし、私は必ずしも、それらの異なるレイヤーのすべてが、私が使っているタイプを正確に知ることを望んでいません。私はタイプを知るために自分と私の目的地が必要です。あなたはany
にそれを貼り付け、あなたは大丈夫です。他の誰もがany
を見るだけで、どちらがラップするのかを知っています。
このプロセスは、送信元と宛先の両方が実際の値の型を認識しているためにのみ機能します。タイプがわからない場合は、any
を使用するべきではありません。 any
の目的は、そこに座って、それを可能な種類の束にキャストする機能を持たない(それは、boost::variant
が対象です)。目的は、関数の署名から型を消去することです。
これにより、一般的なメッセージや信号などが可能になります。イベントハンドラをシステムに登録します。あなたはパラメータとしてany
を取るイベントを発生させます。イベントを発生させる人は、 "MouseClick"イベントが常にvec2
をそのパラメータとして取ることを知っています。したがって、すべての "MouseClick"ハンドラはvec2
にキャストします。 「KeyPress」イベントはint32_t
になります。そのハンドラーはそのタイプにキャストします。その他誰もが実際にどのようなタイプを知っている。
void*
でこれを行う必要がありました。問題は所有者の問題があることです(any
は値ですが、void*
はポインタです)。また、void*
はタイプが消去されているため、キャストが正しいかどうかを確認する方法がありません。 any
は実際には&値の安全なタイプvoid*
です。 に間違ったタイプにキャストすることができなくなります。
あなたは本当にしたくないですany
。あなたのユースケースはvariant
のいずれかになりません。あなたが望むようなものはテンプレートです。これは別の種類のもので、あなたが本当に望んでいることを実行できるようにします。特定の型を使用できる関数を持ちますが、その型が何であるかを正確に知ることができます。
もちろん、テンプレートには独自の制限があります。
Boost.Anyでこれを行うのは簡単ではないので、代わりにBoost.Variantを使用することが基本的な答えになります。 – ildjarn
*なぜ*これを行う必要がありますか? – GManNickG