Tôi không chắc giải pháp nào phải được "khái quát" và "có thể cắm" được, nhưng nếu bạn có thể đủ khả năng sắp xếp của việc sử dụng của bộ nhớ đệm của bạn (chức năng thay thế các cuộc gọi với sử dụng trực tiếp của một số biến), sau đó xem xét như sau:
//works for any CopyConstructible type of cache and any function
//which result should be cached
//(the arguments of the function have to be properly binded)
/**
* caching + lazy initialization
* we shouldn't allow copying of lazy<T>, because every copy initializes its own cache
* and this is not what intended most of the time
* T must be CopyConstructible
*/
template<class T>
class lazy: private boost::noncopyable
{
public:
lazy(boost::function0<T> _creator)
: creator(_creator) {}
/**
* aka is_cashed
*/
bool is_initialized()
{
return val;
}
operator T&()
{
if(!val)
val = creator();
return *val;
}
T& operator*()
{
if(!val)
val = creator();
return *val;
}
/**
* resets cache to update it next time it is used
*/
void reset()
{
val.reset();
}
private:
boost::function0<T> creator;
boost::optional<T> val;
};
//usage
//initialize caching and updating strategy
lazy<WebPage> cached_page(boost::bind(&Server::getPage, server));
server->OnPageUpdate = boost::bind(&OnPageUpdate, cached_page);
.....
//use cached_page everywhere as if it were regular variable of WebPage type
showPage(cached_page);
//--------------
void OnPageUpdate(lazy<WebPage>& page)
{
page.reset();
}
Nếu bạn muốn loại bỏ khởi lười biếng, sau đó sửa đổi sao cho bộ nhớ cache được tạo ra trong hàm tạo và phương thức reset().
Caching loại sự vật nào? Ở đâu? Khi nó đứng, câu hỏi không có ý nghĩa. –
Câu hỏi có ý nghĩa hoàn hảo với tôi, Neil. Có lẽ điều này nên được gắn thẻ là "lập trình chung"? –
@Neil. * Caching giá trị trả về của một hàm * Bên cạnh đó làm cho không có giả định: Nó có thể là một hàm thuần túy, nó có thể không. Nó có thể tải dữ liệu từ một DB hoặc một trang web, hoặc chỉ từ đĩa cục bộ hoặc chỉ cần tính toán nó trên bay. Nó thậm chí có thể là một cái gì đó mà không thể được lưu trữ (cách duy nhất để biết nếu giá trị là cũ là để có được giá trị một lần nữa) hay không. Một giải pháp phải có khả năng đối phó với bất kỳ và tất cả các điều trên ở bất kỳ kết hợp nào. – BCS