Это не тривиально, но вот самый простой способ сделать это:
Вам нужно знать все типы, которые вы будете поддерживать, и что это такое, когда вы их вставляете.
Во-первых, у вас фактически будет структура данных некоторой структуры, подобной
struct { void * data; enum Type tag }
и определите enum Type { int, char*, ... etc }
void *
- это указатель на данные без типа, так что вы можете использовать его для сохранения в порции памяти, содержащей данные, которые вы хотите сохранить.
Тег Type хранит данные, чтобы ваш код, используя их, мог знать, что возвращается из вашей структуры данных.
Если вам не нужно сохранять тип, и вы можете привести его обратно к правильному типу, когда извлекаете его из структуры данных, тогда вы можете опустить тег Type и просто сохранить void *