Re: C++ Makro, template, nebo něco jiného?
Pablo na xpablo.cz
Pablo na xpablo.cz
Pondělí Září 25 13:36:13 CEST 2023
DD,
myslim, ze jste mel spis napsat, co je cilem. Takhle mame "cistit" reseni,
ktere mohlo byt udelane jinak, ale co tam vidim ja:
1. zbytecne vytvarite ukazatele na jednotlive tridy zarizeni (pokud ta
abbrev dev znamena device), kdyz vzdycky budete potrebovat jen jeden a pri
rozsirovani pomoci ifdef budete muset ifdef psat na dvou mistech. Doporucuji
v kazdem case DEV... udelat lokalni ukazatel napr. takto auto devT2 =
dynamic_cast<IDevTyp2*>(dev);
2. nejsem si jisty, jestli by nebyl lepsi pristup udelat predka, tridu IDev
tak, aby obsahoval bud public prvek IDevTyp, nebo napsat getter na IDevTyp -
zbavite se tim toho mambo-jambo se zjistovanim typu zarizeni
3. kdyz udelate virtualni prototyp funkce lastError(), tak se cela saskarna
if... gLastError = .... v kazdem case zjednodusi na jednu jedinou podminku
pred return rc; nejak takhle:
if (rc)
gLastError = devt->lastError();
Otazkou ale je, jestli nebude lepsi mit v tride IDev virtualni metodu na
nastaveni tech parametru a nedelat ji pure virtual - pak sice bude v kazdem
potomkovi, ale prepsana bude jen tam, kde bude skutecne neco delat.
--
Pavel Brychta
http://www.xpablo.cz
---------- Původní e-mail ----------
Od: Pavel Hudeček <edizon na seznam.cz>
Komu: hw-list na list.hw.cz
Datum: 25. 9. 2023 13:06:50
Předmět: C++ Makro, template, nebo něco jiného?
" Dobrý den všem,
mějme funkci jako
int doSomeWithDev(unsigned deviceIndex, int param)
{
std::vector<IDev*> devs = gDevs->devices();
IDev* dev = devs[deviceIndex];
IDevTyp* devt = dynamic_cast<IDevTyp*>(dev);
if (!devt)
return UNEXPECTED_ERROR;
int rc;
IDevTyp2* devT2;
IDevTyp3* devT3;
#ifdef IDevTyp4
IDevTyp4* devT4;
#endif
switch(devt->deviceType()) {
case DEVTYPE2:
tevT2 = dynamic_cast<IDevTyp2*>(dev);
if (!tevT2)
return UNEXPECTED_ERROR;
rc = tevT2->setSomeParam(param);
if (rc){
gLastError = tevT2->lastError();
}
break;
case DEVTYPE3:
tevT3 = dynamic_cast<IDevTyp3*>(dev);
if (!tevT3)
return UNEXPECTED_ERROR;
rc = tevT3->setSomeParam(param);
if (rc){
gLastError = tevT3->lastError();
}
break;
#ifdef IDevTyp4
case DEVTYPE4:
tevT4 = dynamic_cast<IDevTyp4*>(dev);
if (!tevT4)
return UNEXPECTED_ERROR;
rc = tevT4->setSomeParam(param);
if (rc<0) {
gLastError = tevT4->lastError();
}
break;
#endif
default:
gLastError = "Unexpected device type";
rc = UNEXPECTED_ERROR;
break;
}
return rc;
}
A takových má být mnoho, s odlišnostmi jen v tom, co bude místo
->setSomeParam(param);
a kolik to bude mít parametrů.
Chtěl bych to nějak zjednodušit, aby ty funkce nebyly tak dlouhý.
Nějaké nápady?
Díky,
PH
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
"
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230925/ffbac1af/attachment.htm>
Další informace o konferenci Hw-list