【发布时间】:2021-04-09 00:50:19
【问题描述】:
我希望创建一个运算符 += 的模板,用于向向量添加值。我一直在修改参数包,但它对我不起作用(我想我作为 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);
}
我收到一个错误,该表达式包含意外的参数包。如果不是参数包,那么如何通过覆盖运算符将这些值添加到向量中?
提前致谢
【问题讨论】:
-
do to
v += 3, 4, 5, 6;类似于 do(v += 3), 4, 5, 6;然后v += 3;因为下一个值未被使用并被编译器删除。例如,您不在 Python 中,3, 4, 5, 6不是元组 -
为什么不直接使用已经存在的成员函数呢?
v.insert(v.end(), {3, 4, 5, 6}); -
您需要重载
,运算符才能获得准确的语法。这是一个非常奇怪的 hack,可以在初始化列表出现之前使用,现在看起来有点过时了 -
@Insekure 为不涉及程序定义类型的标准容器添加运算符重载通常弊大于利,所以我希望这样做是一种教育练习。在实际代码中看到这一点的人必须立即搜索运算符重载以找出它 relly 的含义。
-
@TedLyngmo 是的,这是一个教育练习,但感谢你和其他人在这个线程中帮助我,我终于明白了模板和覆盖运算符的全部内容。我非常感激。非常感谢大家
标签: c++ vector operator-overloading parameter-passing parameter-pack