如何创建容器模板(例如 std::map)?

发布于 2024-10-24 02:44:50 字数 1270 浏览 3 评论 0原文

所以,我有一个简单的工作代码,例如

template <typename T, typename 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;
}

问题:是否可以在不使用std::map的情况下创建一个新的模板函数,但使用不同的容器(例如 std::mapstd::multimap...),如下所示:

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());
    /* ... */
}

问题:当我我尝试使用它,例如:

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

编译器给了我一个错误:

main.cpp(119) : 错误 C2664: 'mapAt' : 无法将参数 1 转换为 'std::map<_Kty,_Ty>'到 'std::map<_Kty,Ty>; (_cdecl &)' 1>
与 1> [ 1>
_Kty=int, 1> _Ty=字符1> ]1>没有用户定义的转换 可用的操作员可以执行 此转换或运算符 无法调用

So, I had a simple working code, for example

template <typename T, typename 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

能怎样 2024-10-31 02:44:50

你可以这样写:

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); 
}

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); 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文