c++ mi difendo, e template ne ho usati tempo fa, ma devo dire che e' stato piu un esercizio che altro, avreo potuto fare senza, quindi "cargo cult". Devo rivedermeli bene, per capirne il reale (utile) utilizzo.
Concordo su c++, lo apprezzo per le stl, che uso volentieri, e diverse altre cosette.
Un meccanismo pulito per fornire compile-time generics è probabilmente più grave mancanza del C. Se usi C++ come C-replacement riguardati i template perché per creare strutture dati sono veramente una manna dal cielo... o meglio, creare strutture dati in C è comodo quanto una pigna in culo, quindi quando usi C++ ti sembra di stare in paradiso. Non l'hai specificato, ma scommetto che la parte delle stl che usi più spesso sono di gran lunga i containers: vector, string, unordered_map et simili.
Il problema è che C++ ce la mette proprio tutta per implementare ogni features possibile e immaginabile e i risultati sono quelli che sono: un linguaggio frankensteiniano che è impossibile usare in modo corretto. L'overloading è una feature già di per sé controversa che molti linguaggi (vedi
go) scelgono volutamente di non implementare. L'overloading mischiato con i default parameters è intricatissimo da fare in modo
veramente corretto (richiede std::forward e cose di questo tipo). La template specialization classica (quella che ha fatto e ha provato a fare Dani Dollaro nell'open post) è una feature ancora più controversa e che andrebbe usata solo quando non ti è possibile fare overloading; in particolare, può portare a
risultati bizzarri che comunemente non ci si aspetta. E come se non bastasse alla fine ci siamo ridotti a fare una template specialization che non è nemmeno basata sui tipi, ma sul comportamento. Sulla carta ha l'aria di essere una cosa foga, ma di fatto è il peggio del peggio del peggio.
Dany Dollaro ha postato una poof of concept e io mi sono limitato a risolvere quella, ma è probabile che la soluzione migliore per risolvere il problema che sta affrontando consiste nel riprogettare il codice per non usare tutta questa roba.