开发者

HowTo create template of a container (e.x. std::map)?

So, I had a simple working code, for example

template <typename T, ty开发者_如何学Pythonpename VALUE>
VALUE mapAt(T key)
{
    std::map<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                      , end_i(MyMap.end());
    if (item_i == end_i)
    {
        throw std::exception("No such key!");
    }

    return (*item_i).second;
}

Question: is it possible to create a new template function without using std::map, but using different containers (e.x. std::map, std::multimap, ...), something like this:

template <class Container, typename T, typename VALUE>
VALUE mapAt(Container& MyMap, T key)
{
    Container<T, VALUE>::const_iterator item_i(MyMap.find(key))
                                       , end_i(MyMap.end());
    /* ... */
}

Problem: when i'm tring to use it, like:

std::map<int, char> my_map;
char ch = mapAt<std::map<int, char>(), int, char>(my_map, 123); // C2664 error

compiler gaves me an error:

main.cpp(119) : error C2664: 'mapAt' : cannot convert parameter 1 from 'std::map<_Kty,_Ty>' to 'std::map<_Kty,Ty> (_cdecl &)' 1>

with 1> [ 1>

_Kty=int, 1> _Ty=char 1> ] 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called


You can write something like this:

template <class Container>
typename Container::mapped_type mapAt(Container& MyMap, typename const Container::key_type& key)
{
    typename Container::const_iterator iter = MyMap.find(key);
    return iter->second;
}

int main()
{
    std::map<int, char> my_map;
    char ch = mapAt(my_map, 123); 
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜