Search code examples
c++templatesc++11typedeftr1

Typedef a template class without specifying the template parameters


I'm trying to typedef either an unordered_map or std::map depending whether there are TR1 libraries available. But I don't want to specify the template parameters. From what i've read so far, typedef'ing templates without arguments is not possible until official c++0x standard is available. So does anyone know an elegant workaround for this?

#ifdef _TR1
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments
#else
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments
#endif

Solution

  • The way I've seen this done is to wrap the typedef in a template-struct:

    template<typename KeyType, typename MappedType>
    struct myMap
    {
    #ifdef _TR1
        typedef std::tr1::unordered_map<KeyType, MappedType> type;
    #else
        typedef std::map<KeyType, MappedType> type;
    #endif
    };
    

    Then in your code you invoke it like so:

    myMap<key, value>::type myMapInstance;
    

    It may be a little more verbose than what you want, but I believe it meets the need given the current state of C++.