C ++ универсальный контейнер со связанным списком - PullRequest
0 голосов
/ 05 апреля 2011

Я хочу создать универсальный контейнер для использования со связанными списками (например).Я попытался использовать void* в качестве элемента, но это не удается, когда я предоставляю следующее:

list.insert(5);
list.insert("Hello");

Если я выделяю элемент в куче и передаю адрес, он работает, но как я могу справиться со случаемиспользовать переменные стека в примере выше?

Ответы [ 4 ]

4 голосов
/ 05 апреля 2011

Лично я бы использовал для этого boost::any.

1 голос
/ 05 апреля 2011

... может просто попытаться перегрузить функцию вставки ...

List::insert( int i ){}
List::insert( char* i ){}

и т.д ....

0 голосов
/ 05 апреля 2011

Вам нужно как-то добавить размер в байтах.

int x = 5;
insert (&x, sizeof(int));
insert ("Hello", 6);

и т. Д.

Метод вставки может, например, выглядеть следующим образом:

void insert (void* data, size_t size)
{
  node_t node = malloc ...

  node.data = malloc ...
  node.size = size;

  memcpy(node.data, data, size);
}
0 голосов
/ 05 апреля 2011

Если вы действительно хотите универсальный контейнер, у вас нет выбора, кроме как создать фиктивный объект, содержащий скалярное значение (OMG - почему я должен думать о Java?) И вставить его. Вы можете добавить специальные методы insert_int, insert_char, ..., как сделать копирование самостоятельно. Таким образом, у вас также не было проблем с литералами и переменными стека.

...