Ho il codice seguente:Devo usare l'idioma Initialize-on-demand e, in caso affermativo, come?
MyType x = do_something_dangerous();
// ...
if (some_condition) {
// ...
bar(x);
}
else {
// ...
}
// ...
if (another_condition_which_may_depend_on_previous_if_else} {
// ...
baz(x);
}
L'idea è che in alcuni casi, che sono forse difficile/scomodo da determinare in anticipo, ho bisogno di usare x
. Ma nei casi in cui non ho bisogno di usarlo, provare a inizializzarlo potrebbe essere brutto (per esempio, potrebbe bloccare il mio processo).
Ora, sembra che quello che ho bisogno di utilizzare è un initialize-on-demand holder (il link si concentra su Java, quindi ecco un abbozzo): Una specie di Wrapper<MyType>
o Wrapper<MyType, do_something_dangerous>
con un metodo get()
, in modo tale che i primi get()
chiamate do_something_dangerous()
e successivamente get()
s basta passare il valore ottenuto dalla prima chiamata.
- È davvero un approccio appropriato qui?
- Esiste un'implementazione standard (ish) di questo idioma o una variante di esso?
Note:
- potevo usare
boost::optional
, ma sarebbe un po 'ingombrante e anche torcere la destinazione d'uso: "Si raccomanda di utilizzareoptional<T>
in situazioni in cui non v'è esattamente una, chiaro (a tutte le parti) motivo per non avere valore di tipoT
, e dove la mancanza di valore è naturale come avere qualsiasi valore regolare diT
. "
Forse 'boost :: optional' o' std :: experimental :: optional'? –
Penso che il termine che stai cercando sia la memoizzazione, ecco un'altra domanda che potrebbe aiutarti: http://stackoverflow.com/questions/17805969/writing-universal-memoization-function-in-c11 – harald
@NickyC: vedi nota. – einpoklum