Il C ++ è un ibrido non perché consente di scrivere codice in stile C, ma perché supporta diversi paradigmi di programmazione, come procedurali, orientati agli oggetti e generici. Il C ++ non ti obbliga a un modo di fare le cose, e questa è la sua forza, perché diversi problemi possono essere risolti più facilmente usando paradigmi diversi.
IMHO, sarebbe meglio se il linguaggio / compilatore costringesse in qualche modo i programmatori a scrivere codice più elegante.
Quindi devi prima definire cosa significa elegante . Quindi dovresti vedere se la tua definizione di elegant è adatta a tutti i domini e piattaforme problematiche per le quali viene utilizzato C ++. Uno stile di programmazione elegante per la scrittura di un elaboratore di testi per Windows potrebbe non essere adatto per la scrittura di un sistema incorporato.
Valuta la possibilità di scrivere codice C ++ da eseguire su un DSP. Innanzitutto, il compilatore C ++ per quel DSP potrebbe semplicemente non supportare alcune funzionalità C ++, come gli stream. In secondo luogo, sei fortemente limitato dalla velocità della CPU e, eventualmente, dalla memoria, quindi alcune funzionalità C ++ potrebbero semplicemente uccidere le tue prestazioni. Ad esempio, potrebbe essere necessario evitare le funzioni virtuali per motivi di velocità. Tali considerazioni cambierebbero radicalmente il tuo stile di programmazione, rispetto a quello che utilizzeresti su un PC, e C ++ lo consente.
Per riassumere, C ++ è un linguaggio enorme e complicato con molte funzionalità. Esistono molte ragioni per cui un sottoinsieme di tali funzionalità potrebbe non essere applicabile a un determinato progetto: velocità, portabilità, supporto del compilatore o persino esperienza e familiarità del programmatore. Per questa ragione, il linguaggio costringere lo sviluppatore a utilizzare determinate funzionalità rispetto ad altre per ogni dato compito è una cattiva idea. Pensa a Java, dove il linguaggio impone che ogni funzione debba essere un metodo di una classe. Ci sono così tanti casi in cui creare una classe solo per avvolgere un metodo è scomodo e non necessario, eppure devi farlo perché il linguaggio ti obbliga a farlo.