これを理解するまでにはしばらく時間がかかりましたが、boost::any
の意味は混乱します。値型でboost ::ポインタとの混乱と値の比較
は、あなたがそうのようにそれを使用します。
int value = 100;
boost::any something;
something = value;
//...later...
int value = boost::any_cast<int>(&something);
このコードは明確であり、理にかなっているが、店舗value
内部コピーとして。つまり、大きなオブジェクトの場合は、boost::any
の中にコピーされます。コピーされます。また、void*
をこれに置き換えた関数は、boost::any
オブジェクトに含まれる値を変更すると関数外の値が変更されることが予想されます(それはコピーされてから発生しません)。
私はそれにポインタを置くのであれば、物事は奇妙な取得:
私はboost::any_cast
戻りint**
ので、この場合の戻り値を逆参照する必要があります!私もチェックしていないが、something.empty() == true
ならこれがクラッシュするかもしれないと思う。これは全く単純ではありません。
私はboost::any
に値を格納したくないので、ポインタでのみ機能し、意味的にはvoid*
の近くで動作するようにします。ポインタは、いくつかの型安全性が混在しています。本質的には、私が欲しいのはboost::any_pointer
なのです。 boost::any
がポインタ以外のものを受け入れないようにする方法はありますか?それ以外の場合は、boost::any
の代わりに、私が探しているセマンティクスを得ることができますか?
'boost :: any'はかなりeです作成するにはasyを、その後、セマンティクスを変更することができます。 –
あなたの最初のスニペットはうまくいかず、逆参照が必要です(snippet2として)[Demo](http://coliru.stacked-crooked.com/a/df5bdb307f56b709) – Jarod42
あなたはまだ 'boost :: any'をクラスにラップすることができますポインタのみを許可する。 – Jarod42