我想知道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拿地圖的實例隨機只想讀地圖對象的線程?
我應該如何從隨機線程修改地圖對象,例如。插入新的對象或擦除它?
除了發佈的代碼不工作,因爲它用來確定是否要複製的常量不是指向對象的指針,而是指針的指針。所以你不能將一個'const Co'傳遞給一個可能會修改該對象的函數,但是如果你在一個非const指針上調用一個const函數,它將執行該複製。 –
@JamesKanze是的,這就是我所說的「複製如果你不能保證你不寫 - 執行」。我贊成你的回答,因爲我沒有問自己「這個實施很好嗎?」而是「我怎麼解釋它做了什麼?」 ;) – Theolodis