Если типы будут смешанными, что-то должно знать, что это за тип.
Если клиент (или пользователь) стека преобразует типы обратно в правильную форму, то это нормально, но размер все еще должен быть доступен для стека.
Если звонящий знает это тоже, интерфейс может выглядеть так:
void push (const int size, void * value);
void pop (const int size, void ** valueptr);
Я не думаю, что в целом это будет надежно, но если вы пишете компилятор, он может сгенерировать весь правильный код, так же, как и компилятор C.
Внутренне, у меня было бы две версии, одна для отладки, которая сохраняет значение размера, а другая для «производительности», которая не имеет. Сначала я буду отлаживать.
Я бы отказался от идеи указателей, потому что
- используется дополнительное пространство
- выделенное пространство должно чем-то управляться.
Если в стеке хранятся значения, то после извлечения он не несет никакой ответственности.
Реализация:
unsigned char space[BIG];
unsigned char *stack = &space[0];
int top = 0;
void push(const int size, void* value) {
unsigned char* valp = (char *)value;
*(int *)stack = size;
stack += sizeof(int);
for (int i=0; i<size; ++i) {
*stack++ = *val++;
}
}
поп наоборот,