2015-05-22 2 views
1

Я пытался отобразить структуру карты в указатель пустоты и отбросить ее наоборот.Нарисовать структуру карты, чтобы удалить указатель и разыменовать

void addToMap(void *data){ 
// add some elements to the map 
} 

map<string, vector<myStruct> > myMap; 
addToMap(&myMap); 

Я пытаюсь отправить MyMap к функции addToMap в качестве аргумента и добавить некоторые элементы внутри функции. Как я могу почтить параметр void обратно в структуру карты?

Я знаю, что static_cast можно использовать для разыменования типа void, чтобы знать типы. Например:

int* a = new int(); 
void* b = static_cast<void*>(a); 
int* c = static_cast<int*>(b); 

Приведенный выше фрагмент будет работать, но не в этом случае, я полагаю. Я уже пробовал это для своего дела, возможно, должен быть другой трюк.

+2

Это не C, возможно, C++? –

+0

Я строю проект в C++, но есть некоторые библиотеки C, которые я использую, и функция, которая принимает параметр void, из этих библиотек. – serhatg

+0

Не можете ли вы просто вернуть его обратно к типу вашей карты? – simon

ответ

2

В функции addToMap вы можете бросить пустой указатель обратно к первоначальному типу:

void addToMap(void *data){ 
    auto pmap = static_cast<map<string, vector<myStruct> >*>(data); 
    pmap->insert(...); 
} 

static_cast is also able to perform all conversions allowed implicitly (not only those with pointers to classes), and is also able to perform the opposite of these. It can:

Convert from void* to any pointer type. In this case, it guarantees that if the void* value was obtained by converting from that same pointer type, the resulting pointer value is the same.

+0

Ошибка: 'pmap' не называет тип. Пытался скомпилировать с Eclipse на Ubuntu. – serhatg

+0

@serhatg этот код действителен. Какой компилятор вы используете? – Quentin

+0

@Quentin Раньше я использовал Cross g ++, и я просто попробовал его с GNU g ++ 4.6.3. То же самое происходит с ошибкой. – serhatg