LINUX.ORG.RU

Структуры условного выбора типа

 , ,


0

3

У меня возникла идея структуры условного выбора типа.

struct{
int selector_of_type;
void * data_of_selected_type;
}

То есть, это структура последовательности из «выбирающего» и «выбираемого» типа. От значения выбирающего типа зависит тип выбираемого. Было б очень удобно для хранения данных, передачи через сеть итп.

В сишном стандарте этого нет, есть ли в библиотеках типа glib? Хочу знать не изобретаю ли я уже изобретенное?

Изобретаешь, но в этом нет ничего плохого, удобно и практично если с умом делать, вот пример https://github.com/orangeduck/Corange/blob/master/include/casset.h, для статики можно поступить иначе и сунуть в структуру юнион в который сунуть другие структуры и в шапке указывать хранимый тип по id

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от metaprog

Я в курсе, это просто каст к воиду и обратно при заборе данных, юзай и радуйся, используется это часто. Весь вопрос как для для себя это реализуешь. Ссылку я тебе дал, там рабочий пример, много типов все приводятся в void * и указатели складываются в хранилище, доступ к ним по именам, к примеру


entity_new("player",static_object);
entity_new("world",landscape);


static_object  *s = entity_get("player");
landscape      *l = entity_get("world");



А по ссылке тоже что и у тебя

//структура для хранения данных загруженных файлов
typedef struct {
  fpath path; // путь до файла оно же имя для данных
  asset* ptr; // структура данных файла напимер музыка или 3d объект скастованная в void *
  uint32_t timestamp; // время, опционально
} asset_hndl;

тут в хранилище поиск имени по fpath path и отдаётся ptr через макрос который кастует тип обратно

Deleted ()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тип-сумма. Еще есть тип-произведение. И вообще, есть алгебраические типы данных.

Так обломали автора. Он думал, что прорыв в информатике совершил, а тут такое...

anonymous ()

struct {
int selector_of_type;
void * data_of_selected_type;
};

Недостаточно эффективно. Прикольней было б, если бы у вас возникла идея похожей структуры, но которая вся могла бы разместиться в одном непрерывном куске памяти, в том числе на стеке.

Sorcerer ★★★★★ ()
Ответ на: комментарий от metaprog

На C это будет выглядеть как-то так:

struct WebEvent {
    unsigned char discriminant;
    union {
        // discriminant == 0
        struct {} page_load;
        // discriminant == 1
        struct {} page_unload;
        // discriminant == 2
        struct {
            char key;
        } key_press;
        // discriminant == 3
        struct {
            char* buffer;
        } paste;
        // discriminant == 4
        struct {
            int x;
            int y;
        } click;
    };
};
anonymous ()
Ответ на: комментарий от i-rinat

A GVariant cannot contain a pointer. Отметается.

https://developer.gnome.org/glib/stable/glib-GVariant.html

Надо уметь и указатели вмещать, и структуры с указателями. При сериализации/десериализации будут читаться/писаться данные из указателя/в указатель. Кстати, в Метапроге массив - это структура из указателя и длины массива.

metaprog ()
Ответ на: комментарий от metaprog

Надо уметь и указатели вмещать, и структуры с указателями. При сериализации/десериализации будут читаться/писаться данные из указателя/в указатель.

В итоге ты переизобретёшь GVariant или его подмножество. Ничего плохого в этом нет, особенно если хочешь время потратить.

i-rinat ★★★★★ ()
Ответ на: комментарий от metaprog

Наверное автоматом закрывается после 1к комментариев в теме, ну можно сделать чатик какой нибудь, и туда перейти. Главное что бы без регистрации...

Deleted ()

Ты зависимые типы захотел что ли?

В маломальски безопасном ключе это не сделать в сишке, да и ненужно.

Тебе нужен либо класс с методами, либо параметрический контейнер в 99% случаев. Оборачивать тип в контейнер с тагом в сишке безопасно не получится, так что я бы даже не пробовал. В окамле, расте или крестах еще можно.

Freyr69 ★★★ ()