Ho un set di decodificatori di dati caricabili per un tipo specifico di dati e un flusso per leggere i dati contenenti. Ora voglio che il programma selezioni il decodificatore corretto in modo affidabile, quindi voglio usare un algoritmo di prova ed errore. Sembra risonabile creare un decoder e collegarlo allo stream usando un costruttore:
// C++ code
// codecs is an array of structs containing function pointers loaded from a dll
FileIn src("foo.wav");
for(size_t i=0; i<N_CODECS; ++i)
{
try
{
WaveIn wavein(codecs[i],src);
//Process data
return;
}
catch(...) //Swallow error. It's likly that another codec works. But if it were another error??
{
src.reset();
}
}
//no codec found (definitly an error)
Qui, probabilmente non c'è nessun errore vero prima di aver provato tutti i codec nell'elenco. La ragione per cercare di catturare qui è che non è possibile ottenere il codice di ritorno dal ctor. Sarebbe meglio usare gli oggetti zombi in questo caso?
EDIT: ciò che fa il costruttore è il seguente
WaveIn::WaveIn(Vtable& vt, FileIn& src):m_vt(vt)
{
m_handle=m_vt.create(src);
if(m_handle==NULL) //Resources allocated in DLL were released in this case.
{throw "Bad file";}
}
Il dtor:
WaveIn::~WaveIn()
{
m_vt.destroy(m_handle);
}