Способ получения универсальности в C - void *
, так что вы все равно будете использовать указатели, а указатели на разные объекты уникальны. Это означает, что вам нужна хеш-карта или двоичное дерево, содержащее указатели, и это будет работать для всех объектов данных.
Недостатком этого является то, что вы не можете вводить значения самостоятельно. Вы не можете иметь набор, содержащий значение 5; Вы должны присвоить 5 переменной, что означает, что она не будет совпадать со случайной 5. Вы можете ввести ее как (void *) 5
, и для практических целей это, вероятно, будет работать с маленькими целыми числами, но если ваши целые числа могут попасть в большие достаточно размеров, чтобы конкурировать с указателями, вероятность провала очень мала.
Также это не работает со строковыми значениями. Учитывая char a[] = "Hello, World!"; char b[] = "Hello, World!";
, набор указателей найдет a
и b
разными. Возможно, вы захотите хешировать значения, но если вас беспокоит коллизия хешей, вам следует сохранить строку в наборе и выполнить strncmp()
, чтобы сравнить сохраненную строку со строкой проверки.
(Есть аналогичные проблемы с числами с плавающей точкой, но попытка представлять числа с плавающей точкой в наборах - плохая идея).
Следовательно, вам, вероятно, понадобится теговое значение, один тег для любого вида объекта, один для целочисленного значения и один для строкового значения, и, возможно, еще для различных типов значений. Это сложно, но выполнимо.