Как я мог привести к переменному имени класса? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть несколько классов и указатель, какой класс void *, указывающий на один из этих классов.

У меня также есть имя этого класса в строковой переменной, и я хотел бы привести этот пустой указатель на этот класс.

Я бы хотел сделать что-то подобное:

    string className;

    className = "int";

    (className *) voidPointer;

есть ли способ сделать это ??

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Это не так, как вы пытаетесь.

Однако, я думаю, 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_cast, чтобы получить значение, хранящееся в объекте типа boost::any.

1 голос
/ 09 декабря 2011

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 голосов
/ 09 декабря 2011

Конечно, вы можете сделать это:

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

Это не очень элегантно, хотя - но вы, безусловно, можете сделать это, если нужно (но, скорее всего, есть лучшее решение вашей проблемы).

0 голосов
/ 09 декабря 2011

Нет, вы не можете этого сделать.Тем не менее, вы можете использовать шаблонный класс для этого.Заметьте, я предоставляю решение, но я не думаю, что вы все равно должны хранить указатель void*.

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

Затем вы можете сделать:

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

Я повторяювам, вероятно, вообще не нужно использовать void*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...