Приведение структуры карты к пустому указателю и разыменованию

Я пытался привести структуру карты к пустому указателю и наоборот.

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);

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


person serhatg    schedule 22.05.2015    source источник
comment
Это не C, может C++?   -  person Yu Hao    schedule 22.05.2015
comment
Я создаю проект на C++, но есть несколько библиотек C, которые я использую, и функция, которая принимает параметр void, взята из этих библиотек.   -  person serhatg    schedule 22.05.2015
comment
Разве вы не можете просто вернуть его к типу вашей карты?   -  person simon    schedule 22.05.2015
comment
Пожалуйста, используйте тег для языка, на котором вы пишете (язык, о котором на самом деле идет речь, и ответы должны быть написаны). Язык любых библиотек, которые вы можете использовать, вероятно, в значительной степени не имеет значения. Кроме того, просьба расширить, это не сработает. Это ошибка компилятора, ошибка времени выполнения, запуск ракет?   -  person nhgrif    schedule 22.05.2015


Ответы (1)


В функции addToMap вы можете привести указатель void к исходному типу:

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

static_cast также может выполнять все неявно разрешенные преобразования (не только с указателями на классы), а также может выполнять противоположные им преобразования. Оно может:

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

person simon    schedule 22.05.2015
comment
Ошибка: «pmap» не указывает тип. Пытался скомпилировать с Eclipse на Ubuntu. - person serhatg; 22.05.2015
comment
@serhatg этот код действителен. Какой компилятор вы используете? - person Quentin; 22.05.2015
comment
@Quentin Раньше я использовал Cross g++, и я только что попробовал его с GNU g++ 4.6.3. Та же ошибка сопротивляется. - person serhatg; 22.05.2015
comment
@serhatg В своем вопросе вы должны упомянуть, что используете компилятор С++ 03. Замените auto на явный тип указателя :) - person Quentin; 22.05.2015