C++ sablon 2 eltérő és azonos sablonparaméterre is
2020-12-22T18:35:05+01:00
2020-12-23T23:53:36+01:00
2022-08-11T23:45:41+02:00
x00
Tisztelt Tagság!

C++-ban elakadtam itt:

template<class t> template<class u> void f(t x, u y) {}
template<class t> void f(t x, t y) {}

Annyival bonyolultabb, hogy ez egy metódus, tehát a class előtt is van template, és a metódus előtt is: x a this lenne, y típusa lehet más. Ezt nem fogadja el, hogy nem talál olyan deklarációt amire illeszkedne. Próbáltam úgy is hogy template<class t>, és úgy is hogy template<class t> template<>, de nem fogadja el. Hogy lehet akkor megcsinálni? Eltérő névvel volt eredetileg, de hatékonyabb a kód azonos típusnál, ezért szeretném ha automatikusan felismerné. Az se segített hogy az osztályba is beírtam mindkettőnek a fejlécét, nem csak az általánosét. Fel kellene ismernie hogy u = t esetén illik rá. Köszönöm.

A teljes kód lenne:

template<class t> class c { template<class u> void f(c<u> y); template<> void f(c<t> y); }; template<class t> template<class u> void c<t>::f(c<u> y) {} template<class t> template<> void c<t>::f(c<t> y) {}
Ennél tehát próbáltam az üres template<> elhagyásával is, és úgy is hogy az osztályon belül csak az általános van. Mindig az általános van elöl. Nyilván const & valójában, de ezzel most ne bonyolítsuk.
Mutasd a teljes hozzászólást!
C++17-es 'constexpr if' feature is segíthet, ha concepts még nem elérhető.
C++17-es standardat szerintem már bátran használd, ne legyen cél, hogy C++11-el is forduljon!!!

template<class t> struct c { template<class u> void f(u y) { if constexpr(is_same_v<t, u>) { cout<<"tt"<<y<<"\n"; } else { cout<<"tu"<<y<<"\n"; } } };
Mutasd a teljes hozzászólást!

  • Ha a fordítód ismeri a concept-eket, akkor elég egyszerű dolgod van:

    #include <iostream> #include <type_traits> using namespace std; template<class t> struct c { template<class u> requires (!is_same_v<t, u>) void f(u y) { cout<<"tu"<<y<<"\n"; } template<class u> requires is_same_v<t, u> void f(u y) { cout<<"tt"<<y<<"\n"; } }; int main() { c<int> a; a.f(4); a.f(4u); } // expected output: // tt4 // tu4
    Ha ez nem elfogadható, akkor std::enable_if környékén nézz körül, de az nem lesz ennyire 'szép' :)
    Mutasd a teljes hozzászólást!
  • Köszi, egyenlőre akkor marad 2 különböző néven. Visual C++ 2019, biztos ismeri a concepteket, én nem ismerem, értem egyébként mint jelent, be tudnám másolni, de inkább forduljon le régebbi fordítóval is, ne kelljen minden meghívásánál átírni. Visual C++ 2010-ig visszamenőlegesen jó ha lefordul, bár szerintem a mostani kódjaim se fordulnak le. Az enable_if-et ismerem, de reméltem egyszerűbben megoldható.
    Mutasd a teljes hozzászólást!
  • C++17-es 'constexpr if' feature is segíthet, ha concepts még nem elérhető.
    C++17-es standardat szerintem már bátran használd, ne legyen cél, hogy C++11-el is forduljon!!!

    template<class t> struct c { template<class u> void f(u y) { if constexpr(is_same_v<t, u>) { cout<<"tt"<<y<<"\n"; } else { cout<<"tu"<<y<<"\n"; } } };
    Mutasd a teljes hozzászólást!
  • Ez elég egyszerű, bár idejétmúlt megoldás:

    template<class t> struct c { template<class u> void f_helper(u y, true_type) { cout<<"tt"<<y<<"\n"; } template<class u> void f_helper(u y, false_type) { cout<<"tu"<<y<<"\n"; } template<class u> void f(u y) { f_helper(y, typename is_same<t, u>::type()); } };
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
Címkék
abcd