Задать вопрос

Как сделать «trait Rust» на Си?

Доброго времени суток! Изучаю программирование и языки Си,Rust. Как можно сделать на Си что то типа trait из Rust?
Вот примерный код
void say_colour(char *s);
void say_colour(char *s){  printf("машина цветом %s",s);}
typedef struct {
    char z[10];
    void(*say_colour)(char *s);
}Blue;

typedef struct{
    void *colour;
}Car;

int main(int argc, char const *argv[]){
    Blue b = {.z ="blue",.say_colour=say_colour};
    Car car = {.colour = &b};
    //b.say_colour(b.z);
    car.colour.say_colour();
    
    return 0;
}

В Rust я бы colour сделал бы типом trait . который имплементировали нужные мне структуры. Спасибо!
  • Вопрос задан
  • 256 просмотров
Подписаться 4 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
@cython
Это можно реализовать преобразованием указателя на существующую структуру в структуру-трейт, который описывает нужные свойства. Но при таком подходе, при несоответствии трейту, будет Segmentation Fault
#include <stdio.h>

void say_colour(char *s);
void say_colour(char *s){  printf("машина цветом %s",s);}

typedef struct { // Трейт
	char z[10];
	void(*say_colour)(char* s);
} Colour;

typedef struct {
    char z[10];
    void(*say_colour)(char *s);
    int a; // Доп свойство
} Blue;

typedef struct{
    Colour* colour;
} Car;

int main(int argc, char const *argv[]){
    Blue b = {.z ="blue",.say_colour=say_colour};
    Car car = {
    	.colour = (Colour*)&b // Преобразуем Blue в Colour
    };
    car.colour->say_colour("dsfd");
    
    return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы