C ++ STL - 相当于具有赋值的运算符函数对象模板?
Posted
技术标签:
【中文标题】C ++ STL - 相当于具有赋值的运算符函数对象模板?【英文标题】:C++ STL - equivalent of operator function object templates with assignment? 【发布时间】:2015-07-13 20:30:03 【问题描述】:C++ 中有赋值运算符对象吗?喜欢std::plus,但是要+=? (同样minus、multiplies、divides等)
编辑 - 动机:
我认为最好通过在以下代码中使用函数对象(std::plus() 等)来避免额外的副本。
template<typename Op>
static vector<int>& memberwiseAssignOp(vector<int>& lhs, vector<int> rhs, Op op)
size_t const len = rhs.size();
if (len > lhs.size())
lhs.resize(len);
transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), op);
return lhs;
vector<int>& operator+=(vector<int>& lhs, vector<int> rhs)
return memberwiseAssignOp(lhs, rhs, plus<int>());
vector<int>& operator-=(vector<int>& lhs, vector<int> rhs)
return memberwiseAssignOp(lhs, rhs, minus<int>());
【问题讨论】:
阅读标准库提供的符号列表时发现了什么? 无论如何,我不确定这些将如何工作,或者至少它们不会非常混乱。你能解释一下你为什么想要它们吗?也许我们可以帮助您解决实际问题,而不是帮助您进行基本阅读:) 这似乎是the XY problem 的一个实例。正如 LRiO 所说,退后一步,告诉我们高水平的目标。你可能会错误地接近它。 @LightnessRacesinOrbit 和 cdhowie,我为这个问题添加了动机。 你能自己写一个这样的函子吗?它们可能不在标准库中,因为这不是常见的需求。 【参考方案1】:更一般地说,不仅仅是“不,它不存在”,还有一个简单的事实,即赋值运算符的重载需要作为成员函数来完成,所以它真的不能完成。我想,由于我们正在处理的不是真正的运算符,因此可以编写一个函数来接收对对象的非常量引用,并修改该对象所引用的对象。
不过,我完全不确定您是否会从中获益良多。对它产生很大影响的类型实际上是那些修改现有对象比用新值覆盖旧对象便宜得多的类型。
曾经(在 C++11 之前),这可能是相当多的类型。由于引入了右值引用,您可以通过从旧对象移动到新对象并在此过程中按照您认为合适的方式进行修改,从而获得大致相同的效果(但更清晰)。
理论上,可能仍然有一些地方不能很好地工作。一个明显的例子是一个(直接)包含大量数据的对象,所以移动基本上仍然适用于复制。
【讨论】:
这是真的吗?一个函数可以有签名plus(T &a, const T &b)
并在返回之前编辑a
,我知道复杂类型有很多问题,但是如果没有operator + and =
重载,任何事情都不会有复杂性吗?
@Ben:当然,任何接收到非常量引用的东西都可以修改它的操作数。
是的,我只是说,为什么不能完成?如果您有plusEquals(T &a, const T &b)
,您可以将b
添加到a
并在函数中设置a
,只要T
有operator=
和operator+
? std::plus
无论如何都需要 operator+
重载,那么为什么这是不可能的呢?
“赋值运算符的重载需要作为成员函数来完成,所以真的做不到”——对于纯赋值是正确的,但对于 operator+=() 则不然。但是,std::transform() 不会将 T &plusEquals(T &a, const T &b)
作为 op 参数。【参考方案2】:
这是Functional Operations的列表。
如您所见,没有赋值运算符。
您当然可以自己拥有此功能,如下所示:
a = std::plus(a, b);
但这可能根本没有帮助。
【讨论】:
以上是关于C ++ STL - 相当于具有赋值的运算符函数对象模板?的主要内容,如果未能解决你的问题,请参考以下文章