Re: C++ Makro, template, nebo něco jiného?
Pavel Hudeček
edizon na seznam.cz
Pondělí Září 25 14:19:23 CEST 2023
Bohužel se jedná o úpravy již existujícího, poměrně rozsáhlého softwaru.
Některé metody a atributy jsou společné, ty zůstávají v nadřazené třídě.
Jiné nikoli a jsou definovány zvlášť ve svých, případně je některé mají
a jiné ne. No a tam kde nejsou sploečné, vypadají funkce takto.
Na mě právě teď mimo jiné je, vytvořit větší počet takových funkcí, jako
náhradu za sady funkcí po 2, 3 nebo více, kdy v názvu je druh zařízení,
což je relikt z doby, kdy si kdosi myslel, že počet druhů bude 1 a pak
že 2:-)
PH
Dne 25.09.2023 v 13:36 Pablo na xpablo.cz napsal(a):
> 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?
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230925/8d9f810e/attachment.htm>
Další informace o konferenci Hw-list