c++ std::unordered_map使用模板类指针作为键

dfuffjeb  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(107)

我是cpp的初学者,我有一些这样的代码:

#include <iostream>
#include <utility>
#include <map>
#include <unordered_map>

template<typename T,typename EX>
class Attachable
{
    
    static std::unordered_map<T*,Attachable<T,EX>> attachCaches;

    std::unordered_map<std::string,EX> datas;

    Attachable(T* sender):m_attachedObj(sender)
    {
    }

    bool operator==(const Attachable& other)const
    {
        return m_attachedObj == other.m_attachedObj;
    }
public:

    static Attachable<T,EX> attach(T* sender)
    {
        if(attachCaches.find(sender)==attachCaches.end())
        {
            attachCaches.insert(std::make_pair((sender),Attachable<T,EX>(sender)));
        }

        return attachCaches[(sender)];
    }

    void set(std::string key,EX properties)
    {
        datas.insert(key,properties);
    }

    EX get(std::string key)
    {
        return datas.at(key);
    }

private:
    T* m_attachedObj;
};

class Tester
{
public :
    Tester(){}
};

int main()
{
    Tester* a =new Tester();

    Attachable<Tester,std::string>::attach(a).set("test","typeOfInt");

    std::cout<< Attachable<Tester,std::string>::attach(a).get("test");

}

当我尝试编译这段代码时,我将在第952行收到一个错误,在名为emplace(*_First);的函数处

template <class _Iter, class _Sent>
    void _Insert_range_unchecked(_Iter _First, const _Sent _Last) {
        for (; _First != _Last; ++_First) {
            emplace(*_First);
        }
    }

我尝试使用一些基本的指针,如int,但这仍然不起作用:

int* a =new int(4);

    Attachable<int,std::string>::attach(a).set("test","typeOfInt");

    std::cout<< Attachable<int,std::string>::attach(a).get("test");
kognpnkq

kognpnkq1#

如果sender不在map中,attachCaches[(sender)]可能需要默认构造一个Attachabe对象。但是Attachable不提供默认构造函数。因为你实际上知道键总是在Map中,你可以用这种方式实现attach(也更高效,因为它消除了冗余的查找):

static Attachable<T,EX>& attach(T* sender)
{
    auto it = attachCaches.find(sender);
    if (it == attachCaches.end())
    {
        it = attachCaches.emplace(sender, Attachable<T,EX>(sender)).first;
    }

    return it->second;
}

还要注意函数现在如何通过引用返回Attachable。您的原始代码返回了map元素的临时副本;然后在该副本上调用set;那份拷贝就被销毁了map中的原始值从未更新过,因此后续的get没有找到传递给set的值。
Demo

相关问题