Domanda

Recentemente ho cercato di capire un programma C ++ che è stato scritto da qualcuno che presumo avuto un background in programmazione funzionale: per esempio, aveva dichiarato un chiusura di classe che ha ampiamente utilizzato, e che fa un po ' assomigliare ciò che è noto come una chiusura nella programmazione funzionale. Un'altra classe è stato chiamato un guardia , ma non ho ben capito ancora che cosa è bene per. Sembra avere un qualche tipo di funzionalità di pulitura collegato ad esso.

L'unica lingua in cui ho visto un concetto chiamato guardia è Erlang, ma che non guarda a distanza simile al codice che ho trovato. In quali altri lingue sono come un concetto esistono che l'autore del codice C ++ può aver alluso?

È stato utile?

Soluzione

Per me suona come stava usando Raii.
La classe costruttore / distruttore viene utilizzato per gestire simmetricamente una qualche forma di allocazione delle risorse / release in un contesto sicuro un'eccezione (programmatori Java Cosa chiamerebbe finally {} come distruttore viene garantito il di essere chiamato.).

Questo è un C ++ linguaggio molto comune ed è UED ampiamente nella moderna C ++.

Forse il codice simile al seguente:

void Plop()
{
     Guard   guard(lock);
     // Do lots of stuff
}

Qui la guardia sta bloccando la serratura nel costruttore e sbloccare la serratura nel distruttore.

Altri suggerimenti

Il termine "guardia" è usato in diversi linguaggi funzionali il modo in cui è usato in Erlang, ma che l'utilizzo non sembra per adattarsi tua descrizione. Senza vedere il codice C ++ è difficile sapere esattamente cosa è stato inteso da esso.

Una congettura dalla tua descrizione sarebbe che implementa qualcosa come Haskell bracket , che assicura sostanzialmente che alcune risorse sono rilasciate se la funzione termina incartati, anche se accadesse da un'eccezione. In Python si potrebbe usare finally per questo, in C ++ che di solito hanno il codice di pulitura nel distruttore di un oggetto in pila.

In termini generali, un guardia è semplicemente un costrutto che deve valutare al vero per l'esecuzione lungo alcuni percorsi per continuare. Questo o qualcosa di simile esiste in tutti i linguaggi di programmazione Turing-complete utili, ma forse è così fondamentale che non è spesso chiamato separatamente come un'entità. Ecco un semplice esempio in Haskell:

f x
 | x < 0 = -x
 | otherwise = x

Questo è equivalente alla funzione valore assoluto: nega un numero se esso è negativo per produrre la sua controparte positiva; in caso contrario, restituire lo stesso valore passato ci sono due guardie qui:.. x < 0, che è vero quando x è minore di zero, e otherwise, che è sempre vero

modulo Control.Monad Haskell ha guard :

  

guard :: MonadPlus m => Bool -> m ()
  guard b è return () se b è True, e mzero se b è False.

Ad esempio, per calcolare terne pitagoriche dove ogni gamba non più lungo di 25 è, si potrebbe usare

triples = do
  a <- [1..25]
  b <- [a..25]
  c <- [b..25]
  guard (p a b c)
  return (a,b,c)
  where
    p a b c = a*a + b*b == c*c

Per una spiegazione di ciò che sta succedendo, vedi il mio post sul blog A virgola programmabile spiegato .

Guardie in informatica si riferiscono in genere l'espressione booleana che indica che un costrutto loop dovrebbe continuare. Per esempio (pardon il gioco di parole)

for (int i = 0; i < N; ++i)
  /* stuff */

Qui, i < N è la guardia.

E 'difficile rispondere alla tua domanda in modo più approfondito, senza ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top