2017-01-30 9 views
0

インターフェイスの制限により、static_castを使用してMyObject*void*にキャストする必要があります。このポインタを後のインターフェイス呼び出しに戻すときは、void*からMyObject*まで別のstatic_castを実行する必要があります。この場合、dynamic_castは機能しません(hereを参照)。static_castの後にタイプセーフティチェックを実行する方法はありますか?

しかし、他の人がコードの一部を変更しても奇妙なことが起こらないように、型安全性チェックを実行したいと思います。この案内所の下で実行できるチェックがある場合は、どれが最も便利なものでしょうか?

+0

いいえ、 'MyObject *'を 'void * 'に変換するために' static_cast'を使う必要はありません。それは暗黙的な変換です。はい、 'void *'から 'MyObject *'に戻るために 'static_cast'を使う必要があります。 –

+0

コールバックサブミッションとコールバック関数の間のリンクを示すコードコメントは、通常、メンテナに型情報の更新を思い出させるのに十分です。人々があなたのコードで間違っている場合は、ビルド中に実行するスクリプトを書いて、一致するタイプを確認してください。 –

+0

また、型システムを使用して、各コールバックのtypedefを作成し、両者でそれを使用することで、これを保証することもできます。 'async_lookup'関数を持っていれば、' typedef DictionaryEntry async_lookup_cb_type'を宣言できます。 –

答えて

1

いいえ、一度void*をヒットしたら、キャストを正しく取得するにはすべてのコードが必要です。根本的な原因は、あなたが理論的に戻ってくるがほとんど何かを指すことができるということです。:char,int,std::stringstd::complex<double>std::map<int, int>::iteratorそしてもちろんMyObjectです。あなたが直面するだろう

問題はvoid*が実際にMyObjectを指している場合、あなたのキャストがのみ動作するということですが、その場合にはキャストがとにかく必要はありませんでした。

非鋳造回避策は、すべてのvoid*あなたは、MyObject*をキャスト~MyObject()経由で期限切れのポインタを削除し、そしてキャストの前にそのセットをチェックすることにより、作成したのstd::unordered_set<void*>を維持することです。

+0

あなたはこのことについてはっきりしていますが、static_castの後に 'void *'から 'MyObject *'にタイプチェックを行う方法はありませんか? genralでは、オブジェクトが実際に持っているように見えるかどうかを確認する必要があることを意味します。 – Migsi

+0

@Migsi:いいえ考慮すべき3つのケースがあります:チェックが合格、チェックが失敗しました、未定義の動作。 'static_cast 'を実行しようとすると、チェックが成功するかUBになるだけで、UBにヒットした場合は元に戻すことができません。したがって、「チェック失敗」の結果は不可能です。 – MSalters

関連する問題