Прежде всего, я понимаю, как реализовать диспетчерскую таблицу, используя указатели на функции и строку или другой поиск, это не проблема.
Я ищу способ динамически добавлять записи в эту таблицу во время компиляции .
Тип структуры кода, на который я надеюсь, что-то вроде:
Strategy.h -содержит определение функции для диспетчера и определение таблицы диспетчеризации. Strategy.c -содержит код диспетчера
MyFirstStrategy.c -включает Strategy.h и предоставляет одну реализацию стратегии. MyOtherStrategy.c -включает Strategy.h и предоставляет вторую реализацию стратегии
. Идея состоит в том, что код для вставки указателей функций и имен стратегий в диспетчерскую таблицу не должен находиться в файле Strategy.c, а должен находиться в файлах реализации отдельных стратегий, а таблица поиска должна каким-то образом динамически создаваться во время компиляции.
Для таблицы отправки с фиксированным размером этим можно управлять, как показано ниже, но мне нужна таблица с динамическим размером, я не хочу, чтобы реализация Strategy.c включала все файлы заголовков для реализаций, и я бы хотел, чтобы отправка таблица должна быть построена во время компиляции, а не во время выполнения.
Пример фиксированного размера
typedef void strategy_fn_t(int);
typedef struct {
char *strategyName;
strategy_fn_t *implementation;
} dispatchTableEntry_t;
#include "Strategy.h"
void firstStrategy( int param );
#include "Strategy.h"
void otherStrategy( int param );
#include "Strategy.h"
#include "MyFirstStrategy.h"
#include "MyOtherStrategy.h"
dispatchTableEntry_t dispatchTable[] = {
{ "First Strategy", firstStrategy },
{ "Other Strategy", otherStrategy }
};
int numStrategies = sizeof( dispatchTable ) / sizeof(dispatchTable[0] );
Что мне действительно нужно, так это магия препроцессора, которую я могу вставить в файлы реализации стратегии, чтобы обрабатывать это автоматически, например.
#include "Strategy.h"
void firstStrategy( int param );
ADD_TO_DISPATCH_TABLE( "First Strategy", firstStrategy );
Есть идеи ?