Мне просто любопытно знать то, что стратегии? (Если стратегии существуют).
Типичным шаблоном в C для реализации объекта, который может содержать один из нескольких различных базовых типов, является использование структуры
, содержащей один элемент, который является объединение
возможных базовых типов, которые могут быть сохранены, и один элемент, который представляет собой перечисление
, определяющее, для какого из этих типов используется объединение
в данном случае.
Затем вы можете использовать массив таких объектов, возможно, представленный в виде struct
, содержащей несколько элементов и указатель на хранилище для этих элементов.
например. что-то вроде этого:
#include <stdio.h>
#include <stdlib.h>
typedef enum tuple_datatype_e {
TUPLE_DATATYPE_INT,
TUPLE_DATATYPE_FLOAT,
TUPLE_DATATYPE_STRING
} tuple_datatype_t;
typedef struct tuple_item_s {
tuple_datatype_t datatype;
union {
int int_val;
float float_val;
char *string_val;
} u;
} tuple_item_t;
typedef struct tuple_s {
unsigned int n_items;
tuple_item_t *items;
} tuple_t;
static void print_tuple(tuple_t *t)
{
unsigned int i;
printf("(");
for (i = 0; i < t->n_items; i++) {
if (i > 0)
printf(", ");
switch (t->items[i].datatype) {
case TUPLE_DATATYPE_INT:
printf("%d", t->items[i].u.int_val);
break;
case TUPLE_DATATYPE_FLOAT:
printf("%f", t->items[i].u.float_val);
break;
case TUPLE_DATATYPE_STRING:
printf("\"%s\"", t->items[i].u.string_val);
break;
}
}
printf(")\n");
}
int main(void)
{
tuple_t foo;
foo.n_items = 3;
foo.items = malloc(sizeof(tuple_item_t) * foo.n_items);
foo.items[0].datatype = TUPLE_DATATYPE_INT;
foo.items[0].u.int_val = 123;
foo.items[1].datatype = TUPLE_DATATYPE_FLOAT;
foo.items[1].u.float_val = 4.56;
foo.items[2].datatype = TUPLE_DATATYPE_STRING;
foo.items[2].u.string_val = "789";
print_tuple(&foo);
return 0;
}
Хотя это не совсем то же самое, константный массив имеет, по крайней мере, некоторые из тех же свойств. Если вам требуется более точная эмуляция, ADT может помочь.
Наиболее близкими к Python кортежам в C, вероятно, являются либо структуры, либо массивы, в зависимости от того, как вы их будете использовать.
Используйте структуры, если вы хотите сгруппировать фиксированное количество связанных значений, возможно, разных типов.
Используйте массивы, если вам нужно несколько значений одного типа и возможность индексирования в массиве.