C++ Makro, template, nebo něco jiného?

Pavel Hudeček edizon na seznam.cz
Pondělí Září 25 13:03:02 CEST 2023


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
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230925/be5ade06/attachment.htm>


Další informace o konferenci Hw-list