2009-07-11 8 views
0

我應用中的很多不同屏幕一次又一次引用相同的實體/業務對象。
目前,每個屏幕都是指他們自己的每個對象的副本。另外,實體對象本身可能會暴露對其他實體對象的訪問,同樣會創建對象的新副本。
我試圖找到一個緩存解決方案。緩存設計:基於不可變關鍵碼的可變實體對象的輕量級

我在找類似於boost :: flyweight的東西。
但是,基於不可變的鍵/可變值和引用計數。

boost::flyweight<key_value<long, SomeObject>, tag<SomeObject> > object; 

以上幾乎是完美的。 我正在尋找一個類似的容器,它將給SomeObject提供可變的訪問權限

編輯: 我喜歡flyweight的語法和語義。然而,輕量級只允許 const SomeObject &訪問,沒有機會修改對象。

編輯2:代碼必須在MSVC++上編譯6

任何想法?

+0

「以上幾乎完美」 - 它有什麼問題? – 2009-07-11 18:46:06

+0

flyweight只允許const對對象的訪問(const SomeObject&) – 2009-07-12 00:39:43

+0

是否希望它是可變的,以增加每個flyweight的外在信息或僅僅修改共享的內在信息? – p00ya 2009-07-15 07:23:46

回答

1

只要你很高興影響內在狀態,那麼從boost/flyweight/key_value.hpp的內部看起來你可以逃脫const_cast。如果你有自己的密鑰提取器,你應該確保它不會隨着可變的x將會暴露給它的操作而變化。

flyweight<key_value<long, SomeObject> > kvfw(2); 
SomeObject &x = const_cast<SomeObject &>(static_cast<const SomeObject&>(kvfw)); 
+0

我必須在MSVC++ 6上編譯,所以遇到一個麻煩與提升。我應該把它作爲一項要求。 – 2009-07-16 10:32:39

+0

這工作得很好。我隱藏了操作員 - >和操作員* – 2009-08-20 10:26:46

0

我認爲,如果你讓flyweights mutable,那麼他們不能合法地稱爲flyweights。想象一下這樣一種情況,其中字形被表示爲飛錘。如果一個函數改變代表字母「A」的字形的代碼點會發生什麼?另一個在屏幕上呈現字形的函數將嘗試繪製'A',用戶可能會看到'B'或其他東西!我認爲你需要不可變的鍵來引用可變對象。然後,考慮使用hash table加上一些引用計數機制。

+0

,我確實明白你的觀點。雖然,這不是什麼flyweights做?提供引用計數對象的靜態哈希表?我喜歡flyweights的語法,所以我想找到類似的東西。 – 2009-07-17 09:29:08