I almost always use it with types in C++ to make some functions and comparisons more generic- i.e compare by an attribute of a class or struct instead of operator overloading. However, not much beyond that.
For example:
template <typename OBJ, typename ATTR>
void bytype(const ATTR OBJ::*p, const vector<OBJ>& input)
…
bytype<Struct, string>(&Struct::attribute, data);