Sto scrivendo un semplice oggetto vettoriale 2D. Avrà componenti xey, e lunghezza, cross product, ecc. Il fatto è che voglio avere la struttura per avere molti tipi possibili (char, int, float, double, ecc.). Mi chiedevo quale sarebbe stata la scelta migliore, dal punto di vista del design, per interagire con l'oggetto? Ecco quello che sto valutando:Miglior approccio per il polimorfismo strutturale in C
1. Avere l'utente passa l'oggetto vettoriale per funzioni specializzate, come:
Vector2Dt_Dot(Vec2Dt* vector1, Vec2Dt* vector2);
dove 't' è il tipo di vettore. Tuttavia, il problema con questo approccio è che non consente a tipi diversi di interagire tra loro, quindi non posso dire di calcolare il prodotto punto di un vettore float2d e un vettore doppio double. Un secondo approccio, e quello che sto appoggiato verso:
2. che l'utente passare l'oggetto vettore (s) puntatori come void, insieme con i loro tipi, come:
Vector2D_Dot(void* vector1, unsigned vector1_type, void* vector2, unsigned vector2_type);
ovviamente questo l'approccio è più compatto in termini di API e risolve anche il problema di cui sopra, ma al costo di alcuni parametri aggiuntivi e sicurezza del tipo.
Potrebbero esserci altre soluzioni di cui non sono a conoscenza, tuttavia queste sono quelle che sto considerando. Quale pensi che sia il miglior approccio a questo?
@WhozCraig la questione è aggiunto 'C', non' 'C++ –
Non utilizzare il' 'void * alternativo; ci sono troppi modi in cui puoi commettere errori che il compilatore non catturerà (perché qualsiasi tipo di puntatore può essere convertito in un 'void *', in C o C++). Una volta, questa domanda (brevemente) conteneva un tag C++ e per un lungo periodo utilizzava la notazione del tipo di riferimento C++. Se C++ è rilevante, considera un vettore 'vector>'. –
@johnathan leffler: Sì, è stato un mio errore. Passo spesso tra C e C++. Definitivamente utilizzerei un'interfaccia vettoriale come se fosse un'opzione in C. – Shokwav