std::transform 的最后一个参数

Last argument of std::transform

根据cplusplus.comstd::transform 按顺序对一 (1) 个或两 (2) 个范围的元素应用操作,并将结果存储在开始的范围中at result. std::transform 的最后一个参数一般是一个函数,它对第一个容器的元素做一些操作,但是假设我有一个仿函数对象如下:

struct functor {
  functor(int x) : x(x) {}
  int operator()(int x1) {return x + x1;}

  private :
    int x;
}

然后,代替函数,我还可以传递仿函数的实例,如下所示:

vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.resize(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(), functor(1));

我的问题是,编译器如何知道传递给 std::transform 函数的是函数还是仿函数 class 的实例?此外,如果传递了一个实例,内部会发生什么,关于将函数应用于第一个容器的元素?

std::transform 是一个模板(好吧,一个或两个输入范围的两个重载)函数,一个范围可能实现:

template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, 
                   UnaryOperation unary_op)
{
    while (first1 != last1) {
        *d_first++ = unary_op(*first1++);
    }
    return d_first;
}

和两个范围

template<class InputIt1, class InputIt2, 
         class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}

最后一个参数的要求是它有一个 operator () 适用于通过取消引用提供的迭代器获得的类型(即它的参数和 return 类型可以隐式转换为它们)。因此它可以是普通函数、lambda 或具有此类运算符的任何用户类型。