Come disclaimer, sto interpretando "avanzato" qui come non come un modello di classe base per una struttura dati o un modello di funzione per un algoritmo generico che immette gli iteratori. Questo non sembra quasi un territorio da showboating a meno che non si tratti di un gruppo di persone che non sanno come usare il C ++. Sto assumendo cose come, ad esempio, modelli di classi di policy che consentono infinite combinazioni nelle policy quando solo una combinazione è effettivamente utile: soluzioni esotiche ben oltre la norma ... forse anche più avanzate delle policy class: cose senza un nome che le persone non ho mai visto prima, trucchi che usano il linguaggio che non è mai stato ancora applicato nel codice di produzione.
Noooooooooooo!
Il segno distintivo di uno sviluppatore esperto non è colui che applica metatemplates ricorsivi per creare qualcosa che assomiglia a un DSEL di base per risolvere un compito di routine. Questa è la masturbazione programmata: è meglio salvare i progetti di scarto sul lato per capire meglio come funziona la lingua o quando si scrive un libro su come esplorare i confini più profondi di un linguaggio di programmazione.
Non viene nemmeno da un meccanismo elaborato per sostituire 3 linee di semplice testo in 50 file sorgente con 1 riga di codice. Se non altro, l'esperienza ti entusiasmerà inizialmente con tali soluzioni solo nel corso degli anni, tornando alla soluzione semplice quando realizzi che la manutenibilità è stata effettivamente degradata invece di essere migliorata diventando così fantasiosa.
Una delle principali metriche nascoste di manutenzione che non è stata discussa così spesso è "familiarità". Il codice esotico è un codice non familiare, e probabilmente non è familiare neanche a te stesso dopo che è passato del tempo a rivederlo. Questo è il motivo per cui il codice idiomatico è così prezioso - migliora la manutenibilità migliorando la familiarità. Siamo saturi di codice idiomatico e quindi tende a rimanere sempre familiare. "Esotico" è l'esatto contrario, ed è solitamente associato al desiderio di rimodellare il linguaggio di programmazione usato piuttosto che abbracciare i suoi punti di forza e accettare le sue debolezze.
I modelli possono essere modi meravigliosi e semplici per ottenere astrazioni in fase di compilazione senza penalità di runtime, e talvolta sono persino usati correttamente in un contesto ricorsivo o simile a DSEL per qualcosa che la lingua sarebbe altrimenti incredibilmente inetta da gestire. Suppongo che, quando dici "avanzato", usi i modelli in un modo molto insolito. Ma abbracciati troppo in fretta, possono rapidamente finire per neutralizzare gli obiettivi che erano destinati a servire: possono trasformarsi nella macro elaborata.
Se vuoi stupire le persone, usa la soluzione più semplice, più idiomatica e semplice con cui scappare: meno esotico e meglio è. A volte ci sono sezioni in una base di codice che hanno una domanda insolitamente complessa in cui dobbiamo rompere con la norma. Tuttavia, la chiave qui è di fare questo con parsimonia, a malincuore, per non applicare soluzioni complesse per compiti semplici. La soluzione geniale consiste nel trovare una soluzione semplice e simmetrica a un compito apparentemente molto complesso, spesso molto difficile, ma non è così difficile evitare l'applicazione di soluzioni complesse per compiti semplici.
Mentre questo è C anziché C ++, controlla il kernel di Linux. È scritto nel modo più incredibilmente semplice data la combinazione di complessità e natura critica di ciò che sta facendo, eppure è organizzato logicamente e meglio di alcune basi di codice di base che stanno facendo cose molto più semplici. Prendi questo tipo di fonti di semplicità e semplicità come ispirazione e come mezzo per impressionare i tuoi colleghi.
È bello comprendere tecniche davvero avanzate come la complessità di SFINAE, ma salvare tale conoscenza avanzata per i problemi più avanzati in cui le soluzioni avanzate finiscono per essere le soluzioni più eleganti e semplici.