У меня есть функция преобразования десятичного числа в восьмеричное, и я хотел бы называть ее либо int, либо unsigned int в зависимости от некоторых параметров. Моя первая мысль заключалась в том, чтобы скопировать/вставить код и просто изменить тип параметра ... есть ли лучший способ?Типы аргументов Differents для одной и той же функции
ответ
Ну, если вам нужно сделать перегрузку на C, у вас есть три варианта.
- Внесите VFT свое «я». Существует много способов создания VFT и вызова соответствующей функции в зависимости от того, что вы хотите сделать. Просто сделайте проверку для OO в C
- Используйте препроцессор. Вы можете использовать агностические процедуры типа в препроцессоре. Но вам придется делать много проверок для типа аргументов или применять процедуры, которые также являются агностиками типа.
- Используйте аргумент, чтобы предоставить вам случай. У вас может быть функция-обертка с тремя аргументами; основные два аргумента, возможно, указатели типа void, и один из типов string, enum, определенных в препроцессоре или других подобных ситуациях. В зависимости от последнего вы будете делать приемы типов и вызывать соответствующую функцию самостоятельно.
Или ... вы могли бы использовать struct/union (в виде объекта как мода) и в зависимости от его характеристик выполнять соответствующие вычисления. Но я думаю, что для того, что вы должны сделать, этот последний подход был бы слишком большим. На самом деле все было бы слишком много. Что бы я сделал, было бы иметь одну функцию с указателем void как первый аргумент, указатель на вывод и третий аргумент, определяющий тип первого аргумента. Процесс тот же, но у вас разные пределы, которые могут вызвать переполнение в крайних или отрицательных значениях. Таким образом, по третьему аргументу вы будете вызывать первый указатель void и делать преобразование.
Как вы должны знать, подписано или нет знака целого, проверяя его значение? :) Вы не знаете, подписан ли он или нет, поэтому вы не знаете, как интерпретировать значение. «Над пределами подписанного int» - это то же самое, что «если это отрицательно». (С двумя дополнениями, которые по крайней мере.) – Jite
Да, @Jite. Ты прав. Фактически я сделал редактирование, прежде чем я увижу ваш комментарий. – Xxxo
Мне нравится метод указателей void, спасибо :) – Willy
Вы можете использовать союзы:
#include <stdio.h>
enum octal_type {AS_INT, AS_UINT};
typedef union {
int as_int;
unsigned as_uint;
} t_octal;
void fn(t_octal value, enum octal_type type)
{
switch (type) {
case AS_INT:
printf("%d\n", value.as_int);
break;
case AS_UINT:
printf("%u\n", value.as_uint);
break;
}
}
int main(void)
{
t_octal value;
value.as_int = 5;
fn(value, AS_INT);
return 0;
}
Или общие указатели:
#include <stdio.h>
enum octal_type {AS_INT, AS_UINT};
void fn(const void *value, enum octal_type type)
{
switch (type) {
case AS_INT:
printf("%d\n", *(int *)value);
break;
case AS_UINT:
printf("%u\n", *(unsigned *)value);
break;
}
}
int main(void)
{
int value = 5;
fn(&value, AS_INT);
return 0;
}
Под C11 вы можете ommit второй параметр в вызове с помощью _Generic
:
#include <stdio.h>
enum octal_type {AS_INT, AS_UINT};
#define fn(x) fn_impl(x, \
_Generic(*x, signed int: AS_INT, unsigned int: AS_UINT, default: AS_INT))
void fn_impl(const void *value, enum octal_type type)
{
switch (type) {
case AS_INT:
printf("%d\n", *(int *)value);
break;
case AS_UINT:
printf("%u\n", *(unsigned *)value);
break;
}
}
int main(void)
{
int value = 5;
fn(&value);
return 0;
}
- 1. Показать два Differents значения из одной и той же области
- 2. Как вернуть разные типы из одной и той же функции?
- 3. Open Differents дива из одной и тех же функций
- 4. Типы аргументов функции функции
- 5. Как выбрать разные типы одной и той же строки
- 6. Использование различных свойств объекта для одной и той же функции
- 7. Использование одной и той же функции для обработки разных классов
- 8. jQuery - Несколько триггеров для одной и той же функции
- 9. ИЛИ-возвращаемые значения для одной и той же функции
- 10. Как обновить различные аргументы для одной и той же функции?
- 11. Переопределение одной и той же функции для разных подклассов - полиморфизм?
- 12. Несколько больших нотации вывода для одной и той же функции
- 13. HTML несколько событий для запуска одной и той же функции
- 14. C# Применение одной и той же функции для разных переменных
- 15. Обратные вызовы для одной и той же функции
- 16. Как использовать разные типы ввода для одной и той же функции?
- 17. Доступ к этой функции из одной и той же функции
- 18. AssociationTypeMismatch для одной и той же модели
- 19. Больше одного выпадающего списка для одной и той же функции на той же странице
- 20. DB с несколькими внешними ключами, связанными с одной и той же моделью по атрибутам differents
- 21. Использовать разные типы данных параметров в одной и той же функции? (C++)
- 22. Различные типы для той же колонки
- 23. Как принимать разные типы срезов в одной и той же функции?
- 24. Несколько копий одной и той же функции в C
- 25. Выполнение нескольких команд в одной и той же функции (Haskell)
- 26. Вместо вызова одной и той же функции дважды
- 27. Возвратите разные обещания от одной и той же функции
- 28. Вызов одной и той же функции дважды - JavaScript
- 29. Запуск нескольких переменных с помощью одной и той же функции
- 30. Множество типов данных для одной и той же длины бит?
См [функция перегрузка] (http://stackoverflow.com/q/479207/1366431) для обсуждения одного (не обязательно наилучшего) подхода , – Leushenko