Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?

[es] :: C/C++ programiranje :: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?

[ Pregleda: 3009 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 14:20 - pre 220 meseci
Želim nešto nalik na funkciju koja prima promenljiv broj proizvoljnih argumenata, ali naravno tipski bezbedno. Za neki određen konačan broj argumenata, mogao bih npr. da napišem više prepunjenih šablona:

Code:

template <typename T1>
inline void writeLine (const T1 &a1) {
    cout << a1 << endl;
}

template <typename T1, typename T2>
inline void writeLine (const T1 &a1, const T2 &a2) {
    cout << a1 << a2 << endl;
}

template <typename T1, typename T2, typename T3>
inline void writeLine (const T1 &a1, const T2 &a2, const T3 &a3) {
    cout << a1 << a2 << a3 << endl;
}

...

writeLine(10);
writeLine(10, "foo");
writeLine(10, "foo", 8.5);


Mogu li da smuvam nekako da se ovi gore šabloni automatski stvaraju?
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 16:30 - pre 220 meseci
Prochitaj, recimo, ovo :
http://www.cuj.com/documents/s...jcexp2002alexandr/alexandr.htm

 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 17:55 - pre 220 meseci
Časlav je izgleda rešio da C++ forum opet bude zanimljivo mesto. Samo još Advocacy da oživi, pa da bude kao u stara dobra vremena, hehehe.

Elem, i meni su liste tipova pale na pamet, ali ne vidim na prvi pogled kako bismo sa njima konkretno rešili pomenuti problem. Možda je bolje deklarisati šablon kao:

Code:

class NullType{};

// Ovde definiši operator << za tip NullType koji ne radi ništa

template <typename T1 = NullType, typename T2 = NullType, typename T3 = NullType> //ovde ide max broj tipova
inline void writeLine (tuple <T1, T2, T3>& t)  // tuple, npr http://www.boost.org/libs/tuple/doc/tuple_users_guide.html
{
  cout << t; // Ovo se rekurzivno poziva za svaki član n-torke.
}


Malo trapavo, ali mislim da može da posluži.

U stvari, možda je moguće da se napravi meta-petlja koja bi pozivala cout samo za ne-NullType tipove i stala kod prvog NullType.
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 19:38 - pre 220 meseci
Citat:
Dragi Tata:
Časlav je izgleda rešio da C++ forum opet bude zanimljivo mesto

Samo problemi iz stvarnog života, ništa drugo :)

Citat:
inline void writeLine (tuple <T1, T2, T3>& t)// tuple, npr http://www.boost.org/libs/tuple/doc/tuple_users_guide.html

Hm, ali da li će ovo moći da se pozove samo kao:

Code:
writeLine(10, 8.5);


ili n-torka mora da se sagradi pre poziva, pa još navedu tipovi:

Code:
writeLine<int, double>(make_tuple(10, 8.5));


Ja sam nešto smislio sa makroima i prepunjavanjem zapete:

Code:

template <typename T>
inline ostream& operator, (ostream& os, const T &a) {
    return os << a;
}
#define writeLine(...) ((cout, ##__VA_ARGS__) << endl)


Ali mi se ne dopada jer kasnije može zatrebati prepunjena verzija, a ne mogu da prepunim ime makroa.
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 19:46 - pre 220 meseci
Ma ček' bre, kako radi sama make_tuple, to je tačno ono što mi je potrebno? Moraću to da izvidim...
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?19.03.2006. u 20:02 - pre 220 meseci
Ma do... Iz boost/tuple/detail/tuple_basic.hpp:

Code:

template<class T0>
inline typename detail::make_tuple_mapper<T0>::type
make_tuple(const T0& t0) {
  typedef typename detail::make_tuple_mapper<T0>::type t;
  return t(t0);
}

template<class T0, class T1>
inline typename detail::make_tuple_mapper<T0, T1>::type
make_tuple(const T0& t0, const T1& t1) {
  typedef typename detail::make_tuple_mapper<T0, T1>::type t;
  return t(t0, t1);
}

template<class T0, class T1, class T2>
inline typename detail::make_tuple_mapper<T0, T1, T2>::type
make_tuple(const T0& t0, const T1& t1, const T2& t2) {
  typedef typename detail::make_tuple_mapper<T0, T1, T2>::type t;
  return t(t0, t1, t2);
}

...
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..81.static.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?20.03.2006. u 14:13 - pre 220 meseci
Dokument http://www.osl.iu.edu/~jajarvi...ers/vararg_templates_n1483.pdf objasnjava tehniku koju je vec spomenuo Nemanja. Mislim da je to najverovatnije najbolja solucija...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.lstm.uni-erlangen.de.



+27 Profil

icon Re: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?20.03.2006. u 14:25 - pre 220 meseci

Iskopah juče baš taj rad, ali koliko sam ja shvatio, tu se radi o predlogu za proširenje C++a. Da se sintaksno omogući promenljiva lista šablonskih parametara, pomoću trotačke, tako nekako.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Samostvarajući šabloni sa promenljivim brojem šablonskih parametara?

[ Pregleda: 3009 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.