其他分享
首页 > 其他分享> > 当与for_each或std :: transform一起使用时,如何调用C函子构造函数

当与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