<html><body><div>DD,</div><div>myslim, ze jste mel spis napsat, co je cilem. Takhle mame "cistit" reseni, ktere mohlo byt udelane jinak, ale co tam vidim ja:</div><div>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 <font face="Courier New, Courier,
      monospace">auto devT2 = dynamic_cast<IDevTyp2*>(dev);</font></div><div>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</div><div>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:</div><div>if (rc)</div><div>  gLastError = devt->lastError();</div><div>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.<br></div>-- <br>Pavel Brychta<br>http://www.xpablo.cz<br><br><aside>---------- Původní e-mail ----------<br>Od: Pavel Hudeček <edizon@seznam.cz><br>Komu: hw-list@list.hw.cz<br>Datum: 25. 9. 2023 13:06:50<br>Předmět: C++ Makro, template, nebo něco jiného?</aside><br><blockquote data-email="edizon@seznam.cz">
    Dobrý den všem,<br>
    mějme funkci jako<br>
    <br>
    <font face="Courier New, Courier, monospace">int
      doSomeWithDev(unsigned deviceIndex, int param)<br>
      {<br>
          std::vector<IDev*> devs = gDevs->devices();<br>
          IDev* dev = devs[deviceIndex];<br>
          IDevTyp* devt = dynamic_cast<IDevTyp*>(dev);<br>
          if (!devt)<br>
              return </font><font face="Courier New, Courier,
      monospace">UNEXPECTED_ERROR;<br>
          int rc;<br>
          IDevTyp2* devT2;<br>
          IDevTyp3* devT3;<br>
      #ifdef IDevTyp4<br>
          IDevTyp4* devT4;<br>
      #endif<br>
      <br>
          switch(devt->deviceType()) {<br>
              case DEVTYPE2:<br>
                  tevT2 = dynamic_cast<IDevTyp2*>(dev);<br>
                  if (!tevT2)<br>
                      return </font><font face="Courier New, Courier,
      monospace">UNEXPECTED_ERROR;<br>
                  rc = tevT2->setSomeParam(</font><font face="Courier
      New, Courier, monospace"><font face="Courier New, Courier,
        monospace">param</font>);<br>
                  if (rc){<br>
                      gLastError = tevT2->lastError();<br>
                  }<br>
                  break;<br>
              case DEVTYPE3:<br>
                  tevT3 = dynamic_cast<IDevTyp3*>(dev);<br>
                  if (!tevT3)<br>
                      return UNEXPECTED_ERROR;<br>
                  rc = tevT3-></font><font face="Courier New,
      Courier, monospace"><font face="Courier New, Courier, monospace">setSomeParam(</font><font face="Courier New, Courier, monospace"><font face="Courier New,
          Courier, monospace">param</font>);</font><br>
                  if (rc){<br>
                      gLastError = tevT3->lastError();<br>
                  }<br>
                  break;<br>
      #ifdef IDevTyp4<br>
              case DEVTYPE4:<br>
                  tevT4 = dynamic_cast<IDevTyp4*>(dev);<br>
                  if (!tevT4)<br>
                      return UNEXPECTED_ERROR;<br>
                  rc = tevT4-></font><font face="Courier New,
      Courier, monospace"><font face="Courier New, Courier, monospace"><font face="Courier New, Courier, monospace">setSomeParam(</font><font face="Courier New, Courier, monospace"><font face="Courier
            New, Courier, monospace">param</font>);<br>
        </font></font>            if (rc<0) {<br>
                      gLastError = tevT4->lastError();<br>
                  }<br>
                  break;<br>
      #endif<br>
              default:<br>
                  gLastError = "Unexpected device type";<br>
                  rc = UNEXPECTED_ERROR;<br>
                  break;<br>
          }<br>
          return rc;<br>
      }<br>
    </font><br>
    A takových má být mnoho, s odlišnostmi jen v tom, co bude místo<br>
    <font face="Courier New, Courier, monospace">-></font><font face="Courier New, Courier, monospace"><font face="Courier New,
        Courier, monospace">setSomeParam(</font><font face="Courier New,
        Courier, monospace"><font face="Courier New, Courier, monospace">param</font>);</font></font><br>
    a kolik to bude mít parametrů.<br>
    <br>
    Chtěl bych to nějak zjednodušit, aby ty funkce nebyly tak dlouhý.<br>
    Nějaké nápady?<br>
    <br>
    Díky,<br>
    PH<br>
  

_______________________________________________
<br>HW-list mailing list  -  sponsored by www.HW.cz
<br>Hw-list@list.hw.cz
<br>http://list.hw.cz/mailman/listinfo/hw-list
<br></blockquote></body></html>