Для вопроса предположим следующий поток кода:
void * some_data = allocate_memory(const std::string & type)
fetch_data_from_somewhere(some_data);
send_data_to_client(some_data);
allocate_memory
просто выделит пустое сообщение, которое будет заполнено (включая потенциальное дальнейшее выделение динамической памяти) через fetch_data_from_somewhere
, а затем отправлено куда-нибудь на send_data_to_client
. Затем клиент преобразует данные в реальный тип (о котором знает только он).
Теперь я должен написать функцию в allocate_memory
, учитывая только строку, идентифицирующую тип. С помощью этой информации я могу получить структуру данных, описывающую сообщение (например: его длина составляет 80 байтов, в первых 4 байтах целое число, потом std :: vector и т. Д.).
Представьте, что я знаю, что должен выделить std::vector<T>
, где T
- это неизвестный мне тип (опять же, я знаю строковый идентификатор типа и могу получить информацию о его структуре, размере и т. Д.).
Если я использую void * some_memory = calloc(sizeof(std::vector<T>), 1)
, похоже, это работает для всех T
(кроме логических значений) с компиляторами gcc, clang и MSVC ++. Позже клиент может просто выполнить static_cast<std::vector<T>>(some_memory)
, и использование всех векторных операций, похоже, работает. Это кажется несколько разумным, хотя я не могу сказать, гарантированно ли это работает.
Однако, если я хочу передать свой собственный распределитель, мне кажется, что мне не повезло: я ожидаю, что память с нулевым распределением не будет работать, но я не могу действительно void * = new std::vector<T, MyAllocator>(0, my_allocator)
или подобное, потому что я не могу знать T
. Если бы вместо этого мне понадобился вектор типа std::vector<T *>
, я бы предположил, что можно было бы просто использовать std::vecotr<void *>
, поскольку данные в любом случае нетипизированы в памяти.
Есть ли способ выделить std::vector<T, MyAllocator>
с неизвестным типом T
во время компиляции (кроссплатформенный ...)?
Это явно не предназначенное использование или чистый код, но ради вопроса, давайте предположим, что я ничего не могу с этим поделать.