我之前从未使用过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));
答案 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
和(在该点)给定该函数中参数的相应名称。