私は引数としてvoidポインタを持つメソッドを持っています。メソッドの本体では、voidポインタが特定の型のポインタ(私の場合はカード*)に変換可能な場合にのみ実行する必要があるコードを記述します。カードがカードポインタに変換可能かどうかを確認するにはどうすればよいですか?Voidポインタを他の特定のポインタ型に変換できるかどうかをチェックする方法は?
答えて
これを行うためのC++言語機能はありません。
[これはしない] void*
は、タイプ情報を格納する特定の既知のタイプのクラスを指し、もう1つはvoid*
です。次に、最初のvoid*
を型を含むデータ型に変換し、その型があなたが望むものであるかどうかを判定し、入れ子にしてvoid*
を取り込み、それを目的の型にキャストします。
あなたが解決しようとしている問題は実際のです。おそらくへのC++の慣用的なアプローチはです。
独自のタイプ情報を含めることがこれを行う唯一の方法です。 'void *'が必要な場合、正しいデータ型が与えられていると常に仮定しなければなりません。 http://stackoverflow.com/questions/4131091/dynamic-cast-from-void –
'void *'を避けるのが最善の方法ですが、時にはフックを提供するために使用する必要があります。たとえば、マルチスレッドコードを書くとき、 'pthread_create'は' void *(* func)(void *) '型の関数ポインタを期待しています。 (はい、私はpthreadsを使用しますが、使用するコンパイラはC++ 11をサポートしていません) –
@KyleA: 'pthreads'はCであり、C++ 98でもないからです。 C++ 98では、 'class Runnable {virtual void run()= 0;仮想〜Runnable();} '。 – MSalters
- 1. ポインタをvoidポインタに変換できますか?
- 2. どのようにCでvoidポインタをcharポインタに変換しますか
- 3. 関数ポインタが互換性がないポインタ型void(my_type *)からvoid(*)(void *)
- 4. クローンvoid *型のポインタ
- 5. パーズサブクラスのPFUserのポインタ配列に特定のユーザが存在するかどうかをチェックする方法は?
- 6. Swift 3の不透明なポインタから型付きポインタを作成する方法は?スウィフト3への変換
- 7. C++型キャスト:voidポインタからクラスポインタへのポインタをキャスト
- 8. なぜcallocポインタ型がvoid *ですか?
- 9. ポインタ変換で(void *)が必要なのはなぜですか?
- 10. このコールバックでコンパイル時の型チェックを持つものでvoidポインタを置き換えるにはどうすればよいですか?
- 11. 変換void **同等のJava型へのポインタ
- 12. C++でvoidポインタからデータをコピーする方法は?
- 13. 変数をvoidポインタ、またはC++のvoidポインタ参照に送ります
- 14. ポインタから配列への型変換
- 15. void(*)()型のポインターをvoidに変換する方法*
- 16. nullptrを他のポインタ型にキャストできますか?
- 17. "void * 'はvoid *のコードではオブジェクトへのポインタ型ではありませんか?
- 18. void *ポインタのポインタ演算
- 19. PyObjCセレクタでvoidポインタをどのように表現するのですか?
- 20. 特別なポインタ値((void *)1)
- 21. void *はオブジェクト型へのポインタではありません - voidからのキャストエラー**
- 22. 任意の型ポインタへのvoidポインタのキャスト
- 23. C - ポインタがNULLかどうかをチェックする際のセグメンテーションエラー
- 24. floatポインタをcharポインタに型キャストするとどうなりますか?
- 25. C++でvoidポインタとは何ですか?
- 26. gcc(char **→void **)で互換性のないポインタ型を無視する
- 27. GCC警告:void型のポインタ算術*
- 28. golang gobはポインタを0からnilポインタに変換します
- 29. voidポインタからの情報をchar配列に配置する方法は?
- 30. ポインタからのポインタから変数の値を参照するにはどうすればよいですか?
あなたは、ポインタ*が実際には 'card'オブジェクトを指しているかどうかを知りたいのですか?多くの場合、ポインタを変換できますが、変換後にポインタを使用することはできません。 –