Before C++11, we could simply not declare a typedef with a parameterized type. For example, the following did not work:
// We cannot do that.
template<typename T>
typedef std::vector<T> collection;
// We cannot do that either.
template<typename V>
typedef std::map<std::string, V> string_map;// Workaround: nest the type.
template<typename V>
struct string_map
{
typedef std::map<std::string, V> type;
};
// Easy to use, isn’t it?
string_map<int>::type string_to_int;
The alternative was to use a struct to receive the type, then declare the typedef inside the struct:
Starting with C++11, the using keywork allows to declare templated type aliases:
// We can do that.
template<typename T>
using collection = std::vector<T>;
// We can also do that.
template<typename V>
using string_map = std::map<std::string, V>;
// Looks like a first-class type.
string_map<int> string_to_int;
The using keyword is also a replacement for typedef in general.