C++ overloading operator comma for variadic arguments

前端 未结 4 598
终归单人心
终归单人心 2021-01-02 17:52

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

相关标签:
4条回答
  • 2021-01-02 18:27

    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" );
    }
    
    0 讨论(0)
  • 2021-01-02 18:34

    Operators have a fixed number of parameters. You cannot change that. The comma operator takes two arguments. So no. You can roll a custom, cascading version though, with some effort.

    0 讨论(0)
  • 2021-01-02 18:36

    Maybe something like this:

    class MyArgList {
    public:   
         typedef std::list<boost::any> ManyList;
    
         template <typename T>
         MyArgList& operator, (const T& val) {
            elems.push_back(val);
            return *this; 
         }
    
         ManyList::iterator begin() {return elems.begin();}
           ...
    
    private:
         ManyList elems;
    };
    

    Usage would be:

    void foo(MyArgList& list);
    foo((myArgList(),1,2,3,4,5));
    
    0 讨论(0)
  • 2021-01-02 18:52

    No, it isn't. The list of values separated by the comma operator will be evaluated as a single value. For example:

    1,2,3
    

    will result in a single value, 3.

    0 讨论(0)
提交回复
热议问题