Definizione e implementazione del polimorfismo statico

Ho alcune domande sul concetto di polimorfismo statico di cui a volte sento parlare; puoi interpretarli principalmente nel contesto del C ++, ma apprezzerei le risposte indipendenti dal linguaggio laddove applicabile ( quindi taggando sia C ++ che agnostico del linguaggio ).

  1. Come definiamo il polimorfismo statico in generale? Ad esempio, credo che la funzione std::sort da C ++ debba essere considerata staticamente polimorfa in quanto dipende da alcune interfacce fornite da alcuni oggetti che si comportano come iteratori , e il comportamento esatto sotto l’interfaccia degli iteratori forniti può essere determinato nel compile-time. Questa spiegazione spiega come definiamo il polimorfismo statico, o è solo una descrizione di un caso specifico e c’è dell’altro?

  2. Quali sono i modelli di codice comuni dell’uso del polimorfismo statico in C ++? Inoltre: SP viene raggiunto solo tramite modelli in C ++?

  3. È vero che un dato diagramma di class UML non descrive direttamente come viene gestito il polimorfismo e, quindi, può essere almeno parzialmente implementato staticamente o dynamicmente? In altre parole: la scelta del polimorfismo statico o dinamico è indipendente dal modello OOP, e quindi fino a che l’implementatore decide?

  4. Il polimorfismo statico è solo C ++ – specifico e correlato al modo in cui i modelli funzionano? In caso contrario, è presente in altre lingue tradizionali oltre al C ++? Possiamo avere un equivalente di polimorfismo statico in Java, C # .. qualcosa, e porterà qualche vantaggio?

  5. Il più importante … Quali sono i reali benefici dell’uso del polimorfismo statico? Penso che possiamo essere d’accordo sul fatto che riduce la flessibilità del codice; quali sono i vantaggi, inoltre – nel caso del C ++ – salvando un puntatore di riferimento (funzione virtuale / puntatore-a-funzione / costo del delegato)? Qual è la class di problemi in cui il polimorfismo statico è particolarmente utile, la scelta giusta per l’implementazione?

  1. Il comportamento polimorfico statico è il tipo di polimorfismo che si verifica in fase di compilazione piuttosto che in fase di esecuzione.
  2. Sì.
  3. UML riguarda il modo in cui le classi interagiscono in fase di esecuzione – non credo che esista un formato UML per la descrizione dei modelli, ma potrei sbagliarmi.
  4. Per quanto ne so, è specifico per C ++, ma non sono positivo dato che non ho usato tutte le lingue mai inventate. 🙂 Detto questo, linguaggi JIT come C # e Java spesso sono molto bravi a rimuovere l’impatto sulle prestazioni delle chiamate indirette in alcuni casi utilizzando le informazioni raccolte in fase di esecuzione piuttosto che in fase di compilazione. Se questo è in fase di compilazione o meno è piuttosto in aria però … dopo tutto, si chiama un compilatore Just-In-Time.
  5. Il principale vantaggio è semplicemente la prestazione. Il polimorfismo runtime può fare tutto ciò che il polimorfismo statico può fare (in effetti può fare di più), ma comporta il costo delle chiamate indirette (che possono essere costose se ce ne sono abbastanza)

Ora, i modelli stessi hanno molti usi oltre a raggiungere il polimorfismo del tempo di compilazione – ad esempio la magia di SFINAE che rende boost::bind work non è certamente polimorfico – è semplicemente lì per appianare le inconsistenze nella lingua stessa.

Come definiamo il polimorfismo statico in generale?

Il modo migliore per capirlo usando esempi. Il Policy Based Design è un esempio di polimorfismo statico. E a mio parere, è una tecnica molto potente per ottenere il polimorfismo statico.

Un altro esempio è: modello di modello Curiosamente ricorrente (CRTP) che è anche una tecnica potente.

  1. No. Oltre ai modelli, il metodo che si carica è anche il polimorfismo statico. https://en.wikipedia.org/wiki/Function_overloading