[ Časlav Ilić @ 19.03.2006. 14:20 ] @
Ž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?
[ NastyBoy @ 19.03.2006. 16:30 ] @
Prochitaj, recimo, ovo :
http://www.cuj.com/documents/s...jcexp2002alexandr/alexandr.htm

[ Dragi Tata @ 19.03.2006. 17:55 ] @
Č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.
[ Časlav Ilić @ 19.03.2006. 19:38 ] @
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.
[ Časlav Ilić @ 19.03.2006. 19:46 ] @
Ma ček' bre, kako radi sama make_tuple, to je tačno ono što mi je potrebno? Moraću to da izvidim...
[ Časlav Ilić @ 19.03.2006. 20:02 ] @
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);
}

...
[ leka @ 20.03.2006. 14:13 ] @
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...
[ Časlav Ilić @ 20.03.2006. 14:25 ] @

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.