LINUX.ORG.RU

История изменений

Исправление Stanson, (текущая версия) :

А в с++ уже нельзя что-ли сделать массив указателей на функции?

Типа


int (**sch)(int socket, void *data);

int init_sch(type_t *type, int sch_num_fields)
{
  sch = malloc( sch_num_fields * sizeof(void*));
  if( !sch ) return -1;

  // заполняем твою последовательность полей. Лучше конечно в цикле 
  // в соответствии с type[i]
  sch[0] = deserializeInt;
  sch[1] = deserializeInt;
  sch[2] = deserializeString();
  sch[3] = deserializeString();
  sch[4] = deserializeInt();
  sch[5] = deserializeInt();
  return 0;
}
...


// где-то потом, где надо десериализовать твой поток, вне зависимости от схемы просто делаешь:

for( i = 0; i < sch_num_fields; i++ ) sch[i](socket, data);

По скорости ничуть не медленнее будет, и без портянок с if( type == ... )

Исправление Stanson, :

А в с++ уже нельзя что-ли сделать массив указателей на функции?

Типа


int (**sch)(int socket, void *data);

int init_sch(type_t *type, int sch_num_fields)
{
  sch = malloc( sch_num_fields * sizeof(void*));
  if( !sch ) return -1;

  // заполняем твою последовательность полей. Лучше конечно в цикле 
  // в соответствии с type[i]
  sch[0] = deserializeInt;
  sch[1] = deserializeInt;
  sch[2] = deserializeString();
  sch[3] = deserializeString();
  sch[4] = deserializeInt();
  sch[5] = deserializeInt();
  return 0;
}
...


// где-то потом, где надо десериализовать твой поток, вне зависимости от схемы просто делаешь:

for( i = 0; i < sch_num_fields; i++ ) sch[i](socket, data);

По скорости ничуть не медленнее будет.

Исходная версия Stanson, :

А в с++ уже нельзя что-ли сделать массив указателей на функции?

Типа


int (**sch)(int socket, void *data);

int init_sch(type_t *type, int sch_num_fields)
{
  sch = malloc( sch_num_fields * sizeof(void*));
  if( !sch ) return -1;

  // заполняем твою последовательность полей. Лучше конечно в цикле 
  // в соответствии с type[i]
  sch[0] = deserializeInt;
  sch[1] = deserializeInt;
  sch[2] = deserializeString();
  sch[3] = deserializeString();
  sch[4] = deserializeInt();
  sch[5] = deserializeInt();
  return 0;
}
...


// где-то потом, где надо десериализовать твой поток, вне зависимости от схемы просто делаешь:

for( i = 0; i < sch_num_fields; i++ ) sch[i](socket, data);