C++&#x27;s templates are untyped. Rust&#x27;s templates are typed. Most people aren&#x27;t aware of the difference, and they naturally think that templates &quot;have to work&quot; like the ones in their favorite language (dynamically typed if coming from C++ and D, and statically typed if coming from Java, C#, or most other languages). But the fact that Rust and C++&#x2F;D picked different sides of the tradeoff is the key source of the differences between them.<p>C++ and D programmers, like you (and Andrei), look down on Rust generics and give examples of all the things that you can&#x27;t do with Rust generics that are easy to do with C++ templates. But there&#x27;s an equally strong counterargument, in that Rust generics never give errors at template expansion time and are guaranteed to expand to valid code. This makes code easier to understand, improves the experience for users of your generics, and also simplifies the implementation, leading to potentially better compile times (since you typecheck once instead of after every template expansion). Of course, this is a tradeoff: it&#x27;s more work for us to implement the features necessary to do the kinds of sophisticated metaprogramming you see in C++ and D, and there will always be some things you can&#x27;t do in Rust that are easy in C++ and D. But that isn&#x27;t a slam-dunk argument for untyped templates vs. typed generics any more than easy reflection is a slam-dunk argument for dynamic typing like Python vs. static typing like Java.