如何确定 bind() 是否需要参数中的括号

how to decide if bind() need parenthesis in the parameter

我正在使用 bind() 将函数及其参数绑定在一起。我使用了内置仿函数乘法,还尝试了我自己编写的函数 AddVal2()。以下是代码的正确版本。但是我实在不明白为什么std::bind(std::multiplies<int>(),std::placeholders::_1,10)要用multiplies<int>包含(),而bind(AddVal2,std::placeholders::_1,10)却要写AddVal2而不是AddVal2()。谢谢你。

#include<iostream>
#include<vector>
#include<algorithm>
void AddVal2(int x, int y)
{ std::cout << x+y << std::endl;}

int main()
{
        std::vector<int> vec = {1,2,3,4,5};
        std::vector<int> vec_result;
        std::transform(vec.begin(),vec.begin()+2,std::back_inserter(vec_result),std::bind(std::multiplies<int>(),std::placeholders::_1,10));
        for (std::vector<int>::iterator itr = vec_result.begin(); itr !=vec_result.end();++itr){std::cout << *itr << std::endl;}
        for_each(vec.begin(),vec.end(),std::bind(AddVal2,std::placeholders::_1,10));
}

很简单:std::multiplies<T> 是一个 class 模板,它定义了 函数调用运算符。它看起来像这样:

template <typename T>
struct multiplies {
    // some typedefs are here, too
    T operator()(T const& a0, T const& a1) const { return a0 * a1; }
};

要创建这样的对象,您将使用默认构造函数,即 std::multiplies<T>()

另一方面 AddVal2 是一个函数。要从普通函数中获取函数对象,您只需提及该函数,它就会退化为函数指针。或者,您也可以使用 &AddVal2 来显式获取函数指针(对于成员函数,您 来显式获取地址)。