Если вы хотите сделать это в C, вот обходные пути:
// define the enumeration at file scope:
typedef enum {CHIP_WIDE, NODE_WIDE, SYSTEM_WIDE} SomeMatches;
// declare a *pointer* to a function in the struct:
typedef struct {
int *partner;
int *send_first;
double *results;
void (*match_partners)(SomeMatches match);
} test_setup;
Определите вашу функцию как обычно:
void match_partners(SomeMatches match)
{
if (match == CHIP_WIDE) {}
else if (match == NODE_WIDE) {}
else if (match == SYSTEM_WIDE) {}
}
Затем при создании экземпляра структуры присвойте указатель функции:
test_setup t;
t.match_partners = match_partners;
Вам не нужно явно разыменовывать указатель функции для его вызова, поэтому вы можете выполнить свою функцию как
t.match_partners(CHIP_WIDE);
хотя, если вы хотите явно разыменовать его, используйте
(*t.match_partners)(CHIP_WIDE);
Обратите внимание, что C не имеет эквивалента указателю this
; если match_partners
зависит от информации, содержащейся в экземпляре структуры, вам придется явно передать этот экземпляр в качестве отдельного аргумента:
void match_parthers(SomeMatches matches, test_setup *instance)
{
}
...
typedef struct {
...
void (*match_partners)(SomeMatches matches, test_setup *instance);
...
} test_setup;
...
test_setup t;
t.match_partners = match_partners;
t.match_partners(CHIP_WIDE, &t);
Обратите внимание, что для того, чтобы определение структуры было допустимым, мы должны передать экземпляр как указатель , так как тип test_setup
на этом этапе не завершен.
EDIT
Это последнее предложение не очень ясно; Дай мне попробовать снова. Определение структуры не может ссылаться на сам экземпляр, потому что тип структуры не является завершенным до закрытия }
. IOW, следующее не законно:
struct foo
{
...
struct foo bar;
...
};
Однако структура может ссылаться на указатель на другой экземпляр того же типа, поэтому допустимо следующее:
struct foo
{
...
struct foo *bar;
...
};
Та же логика применяется к объявлению указателя функции; параметр instance
должен быть объявлен как test_setup *
, так как определение типа test_setup
на данный момент не завершено. Как отмечает Мерлин в комментариях, вы, вероятно, в любом случае хотите, чтобы экземпляр был изменяемым, но язык требует, чтобы вы использовали указатель в таких обстоятельствах.