Меня попросили написать код, который получает тип данных, не уточняя, какой тип (например, int, float, double ect ..) и, конечно, его число.
Так, как я могу использовать все типы данных?
Ты не можешь. Точнее говоря, сам процессор не может. Чтобы сравнить 2 числа, ЦП должен знать, какой размер у чисел, если числа целочисленные или с плавающей запятой, и (если это не просто сравнение на равенство), если число подписано или нет.
Есть 3 способа обойти это:
a) Дублирование кода (включая шаблоны в C ++, где компилятор автоматически генерирует N версий кода для N типов и использование макросов в C для аналогичных действий).
b) Поддерживает только самый большой тип (например, возможно double
в C) и преобразует все в самый большой тип, так что вам нужна только одна функция для одного типа.
c) злоупотреблять переменными аргументами и иметь ветви времени выполнения, основанные на аргументе «что это за тип» (и повышенный риск ошибок программиста); как int findselectnum(char *data_type, int size, ...)
. В основном это заканчивается скрытым дублированием кода (например, вы дублируете цикл в каждом case
из switch(data_type)
).
В зависимости от реальной ситуации; Я бы использовал смесь первых двух вариантов - например, выясните, почему программное обеспечение было так плохо спроектировано, что оно должно выполнять одну и ту же работу с несколькими различными типами, а затем попытайтесь изменить дизайн, чтобы ему нужно было заботиться только о небольшом количестве различных типов; затем иметь небольшое количество различных функций для типов, которые «неизбежно необходимы» (например, может быть int findselectnum_int(int num, int array[], int size)
и отдельный int findselectnum_double(double num, double array[], int size)
; ничего для float
или short
или чего-либо еще, потому что их можно было избежать).