Search code examples
c++operatorsargumentsvariadiccomma-operator

C++ overloading operator comma for variadic arguments


is it possible to construct variadic arguments for function by overloading operator comma of the argument? i want to see an example how to do so.., maybe something like this:

template <typename T> class ArgList {
public:
    ArgList(const T& a);
    ArgList<T>& operator,(const T& a,const T& b);
}
//declaration
void myFunction(ArgList<int> list);

//in use:
myFunction(1,2,3,4);

//or maybe:
myFunction(ArgList<int>(1),2,3,4);

Solution

  • 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" );
    }