Запятая оператора перегрузки C++ для variadic аргументов

действительно ли возможно создать variadic аргументы в пользу функции путем перегрузки запятой оператора аргумента? я хочу видеть пример, как сделать так.., возможно, что-то вроде этого:

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);
7
задан Jon Seigel 10 April 2010 в 18:39
поделиться

4 ответа

Вроде возможно, но использование будет не очень приятным. Например:

#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) );
}

Этот недостаток будет исправлен в C ++ 0x, где вы можете сделать:

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

или даже со смешанными типами:

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" );
}
11
ответ дан 6 December 2019 в 19:36
поделиться

Может быть, что-то вроде этого:

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;
};

Использовать можно:

void foo(MyArgList& list);
foo((myArgList(),1,2,3,4,5));
1
ответ дан 6 December 2019 в 19:36
поделиться

Операторы имеют фиксированное количество параметров. Вы не можете этого изменить. Оператор запятой принимает два аргумента. Так что нет. Однако вы можете создать кастомную каскадную версию, приложив некоторые усилия.

1
ответ дан 6 December 2019 в 19:36
поделиться

Нет, это не так. Список значений, разделенных оператором запятой, будет оцениваться как одно значение. Например:

1,2,3

приведет к единственному значению 3.

0
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: