Передача любого типа в качестве параметра метода с C - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь использовать метод, который может принимать ЛЮБОЙ ТИП в качестве параметра (Object1, Object2 и т. Д.). Вот очень простой метод, чтобы проиллюстрировать, что он будет пытаться сделать:

void printAnything(Object obj) {
    obj.print("hi");
}

И что я спрашиваю, что бы заменить Object в этом методе?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы не можете этого сделать. В C нет перегрузок, одной функции, одного имени, вам нужно использовать тип, который поддерживает все ваши потребности, например, (недействительно *)

0 голосов
/ 08 января 2019

Передача любого типа в качестве ... параметра

void f(/* no signature here */);

int main() {
  f(1);
  f(1.2);
  f("Hello");
  f(f);
}

void f(/* TBD signature */) {
  ;
}

Вызов функции любого типа прост. Делать что-то полезное с этим - сложная часть.

Пример печати без непосредственного указания типа с помощью _Generic() для управления кодом.

GPrintf("The answer to everything ", GP(42), " or ", GP(42.0), GP_eol);

Основная идея заключается в создании функционально-подобного макроса, который использует _Generic для выбора формы кода. Ниже приведен пример с квадратным корнем.

#define xsqrt(X) _Generic((X), \
  long double: sqrtl, \
  default: sqrt, \
  float: sqrtf \
  )(X)


xsqrt(42.0f); // calls  sqrtf
xsqrt(42.0);  // calls  sqrt
xsqrt(42);    // calls  sqrt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...