Non sono sicuro di quale misura debba essere "generalizzata" e "plug-in", ma se lo può permettere refactoring di utilizzo dei tuoi cache (funzione che sostituisce le chiamate con l'uso diretto di una variabile), quindi prendere in considerazione la seguente:
//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();
}
Se si desidera rimuovere l'inizializzazione pigra, quindi modificare in modo che si crea la cache nel costruttore e nel metodo reset().
Caching che tipo di cose? Dove? Così com'è, la domanda non ha senso. –
La domanda ha perfettamente senso per me, Neil. Forse questo dovrebbe essere etichettato come "programmazione generica"? –
@Neil. * Memorizzazione nella cache del valore di ritorno di una funzione. * A parte ciò, non si fanno ipotesi: potrebbe essere una funzione pura, potrebbe non esserlo. Potrebbe caricare dati da un DB o da una pagina Web, o solo dal disco locale o semplicemente calcolarlo al volo. Potrebbe anche essere qualcosa che non può essere memorizzato nella cache (l'unico modo per sapere se il valore è scaduto è quello di ottenere di nuovo il valore) oppure no. Una soluzione deve essere in grado di gestire qualsiasi e tutte le precedenti in qualsiasi combinazione. – BCS