当与for_each或std :: transform一起使用时,如何调用C ++仿函数构造函数

时间:2011-07-20 03:01:07

标签: c++ functor

我之前从未使用过c ++仿函数,所以我只想了解它们是如何工作的。

e.g。假设我们有这个仿函数类

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));

3 个答案:

答案 0 :(得分:3)

嗯,在最后一种情况下,您正在创建一个新的MultiplyBy对象,其中3作为构造函数参数。然后将此对象传递到std::transform,然后调用operator()

如果它能让你更好地理解,那就完全相同了:

int array[] = {1, 2, 3, 4, 5};
MultiplyBy times3(3);
std::transform(array, array + 5, array, times3);

答案 1 :(得分: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()返回之后)。

答案 2 :(得分:1)

MultiplyBy(3)创建一个未命名的临时变量,该变量将传递到transform和(在该点)给定该函数中参数的相应名称。