Type erasure is a set of techniques for creating a type that can provide a uniform interface to various underlying types, while hiding the underlying type information from the client. std::function<R(A...)>
, which has the ability to hold callable objects of various types, is perhaps the best known example of type erasure in C++.