2011-12-09 16 views
0

私はいくつかのクラスとポインタを持っています。このクラスはvoid *であり、これらのクラスの1つを指しています。どのように私は変数のクラス名にキャストできますか?

私はまた、そのクラスの名前を文字列変数に入れました。私はそのクラスへのvoidポインタをキャストしたいと思います。

私はそのような何かをしたいと思います:

string className; 

    className = "int"; 

    (className *) voidPointer; 

はそれを行うにはどのような方法があります?

ありがとうございます!

+0

C++では不可能です。申し訳ありません。 – Jon

+1

重複している可能性がありますhttp://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name – Joe

+2

? –

答えて

1

C++には反射がありませんので、簡単に行うことはできません。あなたは何ができるか

は、これらの行に何か

string classname; 
void * ptr; 

if (classname == "Foo") 
{ 
    Foo* f = static_cast<Foo*> (ptr); 
} 
else if (classname == "Bar") 
{ 
    Bar* f = static_cast<Bar*> (ptr); 
} 
0

いいえ、あなたはこれを行うことはできませんです。しかし、あなたはこれを行うためにテンプレートクラスを使用すると考えられます。注:私は解決策を提供していますが、とにかくvoid*ポインタを格納する必要はないと思います。

template<class T> 
T* cast(void* ptr) { return static_cast<T*>(ptr); }; 

次に、あなたが行うことができます:

int* intPtr = cast<int>(ptr); 

私は繰り返し、あなたはおそらく全くvoid*を使用する必要はありません。そのあなたが(しかし、おそらくあなたの問題へのよりよい解決策があります)しなければならない場合がありますが、確かに行うことができます -

if (className == "int") { 
    int *intPtr = static_cast<int*>(voidPointer); 
} 

これはしかし、非常にエレガントではありません。

+0

OPには文字列に格納されたクラス名があります。あなたの解決策はそれをカバーしていません –

+0

私はOPに何があったのか分かっています。私は彼がそれをやっているべきだとは思わないが、残念ながら、私たちはすべての問題のスニペットを得るだけである。おそらく、彼は彼が持っている他の "タイプの"フィールドに基づいてキャストしたいと思うかもしれません。おそらく、彼はプロパティ型コレクションに異なる型を格納したいと考えています。あなたは私のドリフトを手に入れますか? –

0

確かにあなたはそれを行うことができます。

2

これは実行できない方法です。

はしかし、私はboost::anyがここであなたを助けることができると思う:ある

boost::any obj; 
if (className == "int") 
    obj = (int)voidPointer; 
else if (className == "short") 
    obj = (short)voidPointer; 

//from now you can call obj.type() to know the type of value obj holds 
//for example 
if(obj.type() == typeid(int)) 
{ 
    int value = boost::any_cast<int>(obj); 
    std::cout <<"Stored value is int = " << value << std::endl; 
} 

は、boost::any型のオブジェクトに格納された値を取得するためにboost::any_castを使用しています。

関連する問題