对多个值使用运算符 +=

问题描述

我希望创建一个运算符 += 的模板,它将向向量添加值。我一直在修改参数包,但它对我不起作用(我想我作为 C++ 的新手做错了什么)。基本上我想用这样的代码实现添加到向量末尾的效果

std::vector<int> v;
v += 3,4,5,6;

如您所见,我想通过运算符覆盖向向量添加多个值。这是我现在拥有的代码

template<typename T,typename... Ts>
void operator+=(std::vector<T> v1,Ts const &... ts) {

   v1.push_back(ts);

}

但我收到一个错误,该表达式包含意外的参数包。如果不是参数包,那么如何通过覆盖运算符将这些值添加到向量中?

提前致谢

解决方法

重载 += 不足以从字面上启用该语法:

std::vector<int> v;
v += 1,2,3,4;

您也需要一个 ,

#include <iostream>
#include <vector>


struct hacky_vector {
    std::vector<int>& v;
    
    hacky_vector& operator,(int x){ 
        v.push_back(x);
        return *this;
    }
    hacky_vector& operator+=(int x){
        v.push_back(x);
        return *this;
    }
};


int main(){
    std::vector<int> x;
    hacky_vector{x} += 1,4;
    for (auto e : x) std::cout << e << " ";
}

输出:

1 2 3 4 

如果没有自定义 operator,,输出只是 1,因为上面一行的另一种写法是

v.operator+=(1),4;

hacky_vector 有效,但在 C++11 之前是一个“好的”黑客。当没有初始化列表和列表初始化时,通常需要一种更好的方法来初始化类似向量的对象,并且一些库发明了像上面这样的东西。如今,不应再使用此类黑客。改用 C++ 已有的东西。

初始化:

std::vector<int> v{1,4,5};

插入(如 Ted 在评论中提到的):

v.insert(v.end(),{1,5});