Я пишу C ++ для приложения VxWorks. Поскольку VxWorks основан на C, функции, которые принимают указатели на функции в качестве аргументов, несовместимы с указателями на функции-члены C ++.
У меня есть класс (SomeClass
), который создается несколько раз с более чем 30 функциями-членами, которые я хотел бы иметь возможность передавать в функции, такие как taskSpawn
, Я знаю два пути этого Можно быть выполненным, но я не особенно люблю ни одно традиционное решение:
Используйте статические функции для вызова указателя на функцию C для определенного объекта:
static void CallFunction1(SomeClass *objectToCallFunction1On);
static void CallFunction2(SomeClass *objectToCallFunction2On);
...
static void CallFunction30(SomeClass *objectToCallFunction30On);void Function1();
void Function2();
...
void Function30();
Используйте целочисленный или перечислимый тип, чтобы указать функцию для вызова определенного объекта:
static void CallFunction(SomeClass *objectToCallFunctionOn, int functionToCall);
void Function1();
void Function2();
...
void Function30();
Я действительно, действительно не нравятся оба этих решения. Есть ли чистое, простое решение этой проблемы?
Первый вариант — использовать массив указателей на функции.
static void (*functionArray[30])(SomeClass *) = {
Function1,
Function2,
Function3,
Function4
//
};
static void CallFunction(SomeClass *objectToCallFunctionOn, int functionToCall) {
functionArray[functionToCall](objectToCallFunctionOn);
}
Другим вариантом будет сделать то же самое с нетиповыми параметрами шаблона. Но я думаю, что первый вариант решает проблему справедливо.
Других решений пока нет …