Languages like Python, Java and Objective-C are examples of duck typing because it is possible in them to construct new types in runtime via reflection and inspect these object whether they implement certain methods. On the contrary side stand languages that rely on compile-time metaprogramming techniques (like C++ and its template system) and thus are not fit into the category of duck typing; instead, at some point in compilation pipeline, all placeholder types become substituted with some concrete types specified in a particular instantiation. Even though certain type erasure is possible in them, runtime inspection is limited.