С небольшой уродливой перегрузкой оператора, это не так уж сложно сделать. Это решение можно легко сделать более общим, но оно должно служить адекватным примером.
#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
. Затем оператор запятой применяется к каждому из последующих элементов в «списке».