나는 COW가 어떻게 작동하는지 이해하려고 노력하고 있는데, 나는 wikibooks에서 클래스를 찾았지만이 코드를 이해하지 못한다.적절한 사용법에 따라 복사 하시겠습니까?
template <class T>
class CowPtr
{
public:
typedef boost::shared_ptr<T> RefPtr;
private:
RefPtr m_sp;
void detach()
{
T* tmp = m_sp.get();
if(!(tmp == 0 || m_sp.unique())) {
m_sp = RefPtr(new T(*tmp));
}
}
public:
CowPtr(T* t)
: m_sp(t)
{}
CowPtr(const RefPtr& refptr)
: m_sp(refptr)
{}
CowPtr(const CowPtr& cowptr)
: m_sp(cowptr.m_sp)
{}
CowPtr& operator=(const CowPtr& rhs)
{
m_sp = rhs.m_sp; // no need to check for self-assignment with boost::shared_ptr
return *this;
}
const T& operator*() const
{
return *m_sp;
}
T& operator*()
{
detach();
return *m_sp;
}
const T* operator->() const
{
return m_sp.operator->();
}
T* operator->()
{
detach();
return m_sp.operator->();
}
};
그리고이 정보는 공유되는 맵 객체의 다중 스레드 응용 프로그램에서 사용됩니다.
map<unsigned int, LPOBJECT> map;
그래서 템플릿을 할당했고 지금은이 :
CowPtr<map<unsigned int, LPOBJECT>> map;
그리고 지금 내 질문 : 나는 propertly 임의의 맵의 인스턴스를해야하는 방법
스레드는 단지지도 객체를 읽으려고합니까?
지도 객체를 임의 스레드에서 수정해야하는 방법 (예 : 새 개체를 삽입하거나 지우시겠습니까?
게시 된 코드가 작동하지 않는다는 점을 제외하고는 복사 여부를 결정하는 데 사용되는 constness가 포인터가 가리키는 포인터가 아니기 때문에. 따라서'CoWPtr const &'를 객체를 수정할 수있는 함수에 전달할 수는 없지만 비 const 포인터에서 const 함수를 호출하면 복사가 수행됩니다. –
@JamesKanze 네, 그게 "당신이 쓰기를하지 않는다고 보장하지 않으면 복사하십시오."입니다. 나는 네 자신에게 "이 구현이 좋은가?"라고 묻지 않았기 때문에 당신의 대답을 반대했다. 오히려 "어떻게 그 일을 설명 할 수 있니?" ;) – Theolodis