Typedef a template class without specifying the template parameters
Asked Answered
C

2

26

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
Cusco answered 24/9, 2009 at 22:5 Comment(2)
See this very close question : https://mcmap.net/q/536639/-creating-a-type-alias-for-a-templated-class and the provided answers. Template typedefs are not valid C++ commandsAppreciate
Very similar question: #6907694 It has another answer that's not mentioned here: "alias template" in c++11Kt
B
38

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++.

Bilocular answered 24/9, 2009 at 22:12 Comment(1)
It is indeed the usual way to simulate the lack of template typedefs in C++. However, I would have named the typedef "type" instead of "value", it seems more correct semantically speaking and it is more idiomatic.Mown
A
4

You have to use full types for typedefs.

Use a #define macro instead.

Amick answered 24/9, 2009 at 22:11 Comment(2)
Sometimes it's best to fall back on the old ways. Duct tape programming at its best.Cloakroom
unfortunately macros don't respect scope.Conversion

© 2022 - 2024 — McMap. All rights reserved.