C++ variadická metóda s rest operátorom

C++ variadická metóda s rest operátorom
« kdy: 03. 04. 2020, 16:50:36 »
Mám takúto variadickú templatu (toto je len príklad v kóde použijem niečo trochu iné, ale v princípe ide o to isté).

Citace
template<typename ...Args>
void log(Args&&... args) {
   (std::cout << ... << args) << endl;
}

no a keď  túto funkciu pridám triede ako metódu tak nejde skompilovať. Prečo? Robím niečo zle? A ako donútiť compiler aby som tú variadickú funkciu vedel použiť aj ako metódu triedy? Alebo to vôbec nejde? Compiler používam C++ 17 ale podporuje to aj veci z C++ 20.


Re:C++ variadická metóda s rest operátorom
« Odpověď #1 kdy: 03. 04. 2020, 23:50:58 »
Kde překladač píše chybu? Jestli je problém s aplikací operátoru <<, zkusil bych něco takovéhoto:
Kód: [Vybrat]
template <typename T, typename ... Args>
class logger {
  static void log (T & a1, Args & ... args)
  {
    cout << T;
    log(args);
  }
}

template <>
class logger {
  static void log ()
  {
    cout << endl;
    log(args);
  }
}

Prostě takový trošku funkcionální přístup. Ale berte to jen přibližně, už je to pár let, co jsem si s tímhle hrál. Obvykle se v těchto případech spokojím s variadickým pojetím funkcí z C a formátovacími řetězci.

Re:C++ variadická metóda s rest operátorom
« Odpověď #2 kdy: 04. 04. 2020, 00:01:47 »
Iterovani pres parameter pack: https://stackoverflow.com/a/26550177/6950905

Re:C++ variadická metóda s rest operátorom
« Odpověď #3 kdy: 04. 04. 2020, 10:56:38 »
Problém zjevně není v té variadické šabloně, ta je v pořádku. Problém bude v jejím použití, což ale v tom dotazu není vidět. Identifikátor log totiž není funkce, ale pouze šablona, podle níž se vyrobí funkce až v okamžiku, kdy se jí předají argumenty. Šablonu tedy nejde použít jako běžnou funkci, dokud nespecifikujeme šablonové parametry.
« Poslední změna: 04. 04. 2020, 11:05:09 od Michal Strnad »

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:C++ variadická metóda s rest operátorom
« Odpověď #4 kdy: 04. 04. 2020, 11:30:24 »
Takový parameter pack se řeší rekurzí, chce to tu funkci ve dvojím provedení.


Re:C++ variadická metóda s rest operátorom
« Odpověď #5 kdy: 04. 04. 2020, 13:44:04 »
Jako volná funkce i jako metoda třídy mi to funguje, viz tady. Asi by bylo vhodné ukázat, co přesně nefunguje.

Re:C++ variadická metóda s rest operátorom
« Odpověď #6 kdy: 04. 04. 2020, 23:21:50 »
Ďakujem za odpovede a ospravedlňujem sa, problém bol asi v mojej nepozornosti, niečo som si asi nevšimol. Lebo teraz to funguje aj mne.  A najhoršie je že ani netuším kde bola chyba, mal som sem skopírovať celý zdroják. Každopádne problém je vyriešený.