Ho cambiato leggermente titolo perché ho pensato che fosse una domanda più appropriata.C++, questa dichiarazione goto è giustificata?
Vuoi refactoring (sembra legittimo uso di goto)? Se, come dovresti refactoring il seguente codice per rimuovere go to statement?
if (data.device) {
try {
...
}
catch(const std::exception&) { goto done; }
... // more things which should not be caught
done: ;
}
dichiarazione completa
#ifdef HAVE_GPU
// attempt to use GPU device
if (data.device) {
try {
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
}
// if GPU fails, propagate to cpu
catch(std::exception) { goto done; }
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
done: ;
}
#endif
ringraziamento
dopo aver visto la preferenza della maggior parte, ho deciso di andare con la bandiera, ma con il signor York commento.
Grazie a tutti
Difficile dire senza vedere cosa c'è nei blocchi, ma un'altra possibilità è spostare il codice all'interno di if in una funzione. (Potrebbe anche migliorare la leggibilità, forse no.) Quindi puoi tornare presto se succede qualcosa di brutto. – GManNickG
Catch con riferimento const, per favore. –
@GMan ha aggiunto la dichiarazione completa. La funzione potrebbe essere eccessiva, poiché non c'è chiusura. – Anycorn