動的にobjectのclassを判定したいですが
動的にobjectのclassを判定したいですが
お久しぶりです。
最近すごい悩んでいることあります。
何かというと
例えば、
void * pt;
を定義して
class A, class B, class C
のobject(即ちinstance)のpointerをptに代入して、
実行するとき(run time)に ptが指しているobjectが
class Aのものか、Bのものか確認できるようにしたいですが、
typeid だといつも「void *」として判定されるようですね。
なにかいい方法あるのでしょうか。
環境:VC2005
お願いします!
最近すごい悩んでいることあります。
何かというと
例えば、
void * pt;
を定義して
class A, class B, class C
のobject(即ちinstance)のpointerをptに代入して、
実行するとき(run time)に ptが指しているobjectが
class Aのものか、Bのものか確認できるようにしたいですが、
typeid だといつも「void *」として判定されるようですね。
なにかいい方法あるのでしょうか。
環境:VC2005
お願いします!
Re:動的にobjectのclassを判定したいですが
void*はポインタを格納する以外に情報(型に関する)がないので、それは無理だと思います。型に関する情報と言うのは
ポインタを参照する時に型が分からないと参照できないので、int*のintには、これはint型へのポインタであるということ
を、識別させる役割があるのです。void*が参照できないのはそういうわけがあり、そこには何かしらのポインタ値以外の
情報はありません、なので、void*に入っているポインタ値から型を判別するのは、たぶん無理、または相当の難易度となると思います。
ポインタを参照する時に型が分からないと参照できないので、int*のintには、これはint型へのポインタであるということ
を、識別させる役割があるのです。void*が参照できないのはそういうわけがあり、そこには何かしらのポインタ値以外の
情報はありません、なので、void*に入っているポインタ値から型を判別するのは、たぶん無理、または相当の難易度となると思います。
Re:動的にobjectのclassを判定したいですが
>いっその事、各クラスに同名の判別用のメンバ関数を追加して戻り値で判別するとかどうでしょう…面倒か…(笑)
たぶんvoid*から取り出すにはキャストが必要だと思うんですけど。たぶんキャストが必要な時点でそれはできなくなると思います。
たぶんvoid*から取り出すにはキャストが必要だと思うんですけど。たぶんキャストが必要な時点でそれはできなくなると思います。
Re:動的にobjectのclassを判定したいですが
一度void*に変換してしまうと、元の型情報は失われてしまいます。
元の型情報を保存したいのであれば、別に管理する以外にありません。
例えば、
元の型情報を保存したいのであれば、別に管理する以外にありません。
例えば、
#include <utility> #include <typeinfo> using namespace std; class A { ... } a; std::pair<void*, const std::type_info*> x(&a, &typeid(a));のようにです。
Re:動的にobjectのclassを判定したいですが
みなさんのご返答をお伺いしますと
現時点のC++言語仕様自身には解決の仕組みはないということですね?
VC2005のような拡張したC++にも動的にobjectの中身(本当の所属class)を確定する文は
ないでしょうか。
VC2005の拡張仕様に詳しい方いらっしゃいましたら、一言でも
お願い致します
現時点のC++言語仕様自身には解決の仕組みはないということですね?
VC2005のような拡張したC++にも動的にobjectの中身(本当の所属class)を確定する文は
ないでしょうか。
VC2005の拡張仕様に詳しい方いらっしゃいましたら、一言でも
お願い致します
Re:動的にobjectのclassを判定したいですが
> VC2005のような拡張したC++にも動的にobjectの中身(本当の所属class)を確定する文は
> ないでしょうか。
拡張というのは、(原則として)規格厳密合致プログラムの挙動を変えることはありません。
その意味で、一度void*に変換してしまえば型情報は必ず落ちます。
> ないでしょうか。
拡張というのは、(原則として)規格厳密合致プログラムの挙動を変えることはありません。
その意味で、一度void*に変換してしまえば型情報は必ず落ちます。
Re:動的にobjectのclassを判定したいですが
横取り申し訳ない、
void * pointer だめなら、
ほかに、何かなんでも入れられるようなもの(handler? container? ----名前は知らないだけど)
も存在するのでしょうか。
void * pointer だめなら、
ほかに、何かなんでも入れられるようなもの(handler? container? ----名前は知らないだけど)
も存在するのでしょうか。
Re:動的にobjectのclassを判定したいですが
> ほかに、何かなんでも入れられるようなもの(handler? container? ----名前は知らないだけど)
> も存在するのでしょうか。
boost::anyがそうです。
これならポインタに限らず、コピーコンストラクタを持ち、代入可能なあらゆるオブジェクト型を扱えます。
> も存在するのでしょうか。
boost::anyがそうです。
これならポインタに限らず、コピーコンストラクタを持ち、代入可能なあらゆるオブジェクト型を扱えます。
Re:動的にobjectのclassを判定したいですが
たかぎさん
お世話になっております。
>boost::anyがそうです。
1点だけ確認させていただきます。
boost::anyを利用する場合、代入してから、
ある時(run time)その代入しているobjectの所属classを知ることができますか。
宜しくお願いします
お世話になっております。
>boost::anyがそうです。
1点だけ確認させていただきます。
boost::anyを利用する場合、代入してから、
ある時(run time)その代入しているobjectの所属classを知ることができますか。
宜しくお願いします
Re:動的にobjectのclassを判定したいですが
> ある時(run time)その代入しているobjectの所属classを知ることができますか。
できます。
boost::any::typeメンバ関数を使えば、そのとき格納されているオブジェクトの型に応じた、std::type_infoのconst参照を返します。
できます。
boost::any::typeメンバ関数を使えば、そのとき格納されているオブジェクトの型に応じた、std::type_infoのconst参照を返します。