当与for_each或std :: transform一起使用时,如何调用C函子构造函数
作者:互联网
我之前从未使用过c仿函数,所以我只是想了解它们是如何工作的.
例如假设我们有这个仿函数类
class MultiplyBy {
private:
int factor;
public:
MultiplyBy(int x) : factor(x) { }
int operator () (int other) const {
return factor * other;
}
};
像我这样使用它对我来说很清楚:
MultiplyBy mult_3(3);
int x = mult_3(100);
显然,使用参数3调用MultiplyBy的构造函数.
但在下面的例子中,如何使用数组中的值调用构造函数?
int array[5] = {1, 2, 3, 4, 5};
std::transform(array, array + 5, array, MultiplyBy(3));
解决方法:
您可以认为变换的结构如下:
void transform(Iterator b, Iterator e, Functor f)
{
for(;b != e; ++b)
{
*b = f(*b);
}
}
函数通过值传递给函数.
所以当你这样打电话时:
std::transform(array, array + 5, array, MultiplyBy(3));
在这里您创建了一个临时对象.这作为参数值传递给transfer().这导致仿函数被复制到函数中(不是问题,因为它只有一个POD成员,并且编译器生成的拷贝构造函数工作得很好).然后可以正常使用该参数.
注意:临时对象在创建它的表达式的末尾被销毁(将在transform()返回之后).
标签:c,functor 来源: https://codeday.me/bug/20190730/1577542.html