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