+ = на векторе без буста - PullRequest
       39

+ = на векторе без буста

2 голосов
/ 07 августа 2010

Есть ли способ использовать оператор + = с вектором, не используя boost или не используя производный класс?

Например.

somevector += 1, 2, 3, 4, 5, 6, 7;

фактически будет

somevector.push_back(1);
somevector.push_back(2);
somevector.push_back(3);
etc.

Ответы [ 2 ]

14 голосов
/ 07 августа 2010

С небольшой уродливой перегрузкой оператора, это не так уж сложно сделать. Это решение можно легко сделать более общим, но оно должно служить адекватным примером.

#include <vector>

В желаемом синтаксисе используются два оператора: оператор += и оператор ,. Во-первых, нам нужно создать класс-оболочку, который позволит нам применить оператор ,, чтобы поместить элемент в конец вектора:

template <typename T>
struct push_back_wrapper
{
    explicit push_back_wrapper(std::vector<T>& v) : v_(&v) { }

    push_back_wrapper& operator,(const T& x)
    {
        v_->push_back(x);
        return *this;
    }

    std::vector<T>* v_;
};

Затем, чтобы использовать это вместе с += для вектора, мы перегружаем оператор += для вектора. Мы возвращаем экземпляр push_back_wrapper, так что мы можем связать откат с оператором запятой:

template <typename T, typename U>
push_back_wrapper<T> operator+=(std::vector<T>& v, const U& x)
{
    v.push_back(x);
    return push_back_wrapper<T>(v);
}

Теперь мы можем написать код, который вы имеете в своем примере:

int main()
{
    std::vector<int> v;
    v += 1, 2, 3, 4, 5, 6, 7;
}

v += 1 вызовет нашу operator+= перегрузку, которая вернет экземпляр push_back_wrapper. Затем оператор запятой применяется к каждому из последующих элементов в «списке».

5 голосов
/ 07 августа 2010

Не с таким синтаксисом, нет. Но вы могли бы сделать что-то вроде этого:

int tmparray[] = {1, 2, 3, 4, 5, 6, 7};

somevector.insert(somevector.end(), 
                  tmparray, 
                  tmparray + (sizeof(tmparray) / sizeof(tmparray[0])));
...