"generic programming" is not the same thing as "the C++ STL"
Generic programming is great (partly) beacuse generic programs provide better abstraction and more reusable code. Languages that don't support generic programming facilities are problematic.
Of course, it really depends on the type of the language.
In dynamically typed languages, you don't need GP in order to write polymorphic routines. Same is true with languages that support polymorphic types.
In OOPLs, you often rely on the fact that all object have a common ancestor, so your routines and data structures can use Object*. In static compiled languages (think Java) this is no more than a disgusting hack used to bypass type checking at compile time.
Languages with first class functions can often simulate GP, simply by passing routines around. Notice however that GP often (as in the Ada case for example) allows instantiation and composition to be done at compile time (and enjoy all the advantages of compile time checking, and reduced runtime overhead).
GP is primarily used for polymorphic data types and as a technique to connect and compose abstractions. Even if we dismiss the first use as something that can be handled better using polymorphic data types, and even by using dynamic typing, we should realize the the second use is more fundamental to the way we think about software. In this sense GP adds important expressiveness to programming languages.
By the way, the C++ model and the STL allow for template specialization, which can be seen as adding another level of abstraction. This feature is, of course, a way to achive things usually done with (the more problematic) help of inheritance.
STL's main success is teaching many programmers about the basics of GP.
|