对多个值使用运算符 +=
Using operator += with multiple values
我想创建一个运算符 += 的模板,它将向向量添加值。我一直在修改参数包,但它对我不起作用(我想我作为 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,2,3,4;
for (auto e : x) std::cout << e << " ";
}
输出:
1 2 3 4
没有自定义 operator,
输出只是 1
,因为上面一行的另一种写法是
v.operator+=(1),2,3,4;
hacky_vector
有效,但它是一种在 C++11 之前“还行”的 hack。当没有初始化器列表并且没有列表初始化时,通常需要一种更好的方法来初始化类似向量的对象,并且一些库发明了类似上面的东西。现在不应该再使用这样的黑客了。使用 C++ 已有的东西。
初始化:
std::vector<int> v{1,2,3,4,5};
插入(如 Ted 评论中所述):
v.insert(v.end(), {1,2,3,4,5});
我想创建一个运算符 += 的模板,它将向向量添加值。我一直在修改参数包,但它对我不起作用(我想我作为 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,2,3,4;
for (auto e : x) std::cout << e << " ";
}
输出:
1 2 3 4
没有自定义 operator,
输出只是 1
,因为上面一行的另一种写法是
v.operator+=(1),2,3,4;
hacky_vector
有效,但它是一种在 C++11 之前“还行”的 hack。当没有初始化器列表并且没有列表初始化时,通常需要一种更好的方法来初始化类似向量的对象,并且一些库发明了类似上面的东西。现在不应该再使用这样的黑客了。使用 C++ 已有的东西。
初始化:
std::vector<int> v{1,2,3,4,5};
插入(如 Ted 评论中所述):
v.insert(v.end(), {1,2,3,4,5});