It is sort-of possible, but the usage won't look very nice. For exxample:
#include <vector> #include <iostream> #include <algorithm> #include <iterator> template <class T> class list_of { std::vector<T> data; public: typedef typename std::vector<T>::const_iterator const_iterator; const_iterator begin() const { return data.begin(); } const_iterator end() const { return data.end(); } list_of& operator, (const T& t) { data.push_back(t); return *this; } }; void print(const list_of<int>& args) { std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); } int main() { print( (list_of<int>(), 1, 2, 3, 4, 5) ); }
This shortcoming will be fixed in C++0x where you can do:
void print(const std::initializer_list<int>& args) { std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); } int main() { print( {1, 2, 3, 4, 5} ); }
or even with mixed types:
template <class T> void print(const T& t) { std::cout << t; } template <class Arg1, class ...ArgN> void print(const Arg1& a1, const ArgN& ...an) { std::cout << a1 << ' '; print(an...); } int main() { print( 1, 2.4, 'u', "hello world" ); }
operator().