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

C++ 如何确定bind()参数中是否需要括号,c++,c++11,stl,bind,C++,C++11,Stl,Bind,我使用bind()将函数及其参数绑定在一起。我使用内置函子乘法,还尝试了我自己编写的AddVal2()函数。以下是代码的正确版本。但是我真的不明白为什么std::bind(std::multiples(),std::placeholders::1,10)必须包含()和乘法,而bind(AddVal2,std::placeholders::1,10)写AddVal2。多谢各位 #include<iostream> #include<vector> #include<a

我使用bind()将函数及其参数绑定在一起。我使用内置函子乘法,还尝试了我自己编写的AddVal2()函数。以下是代码的正确版本。但是我真的不明白为什么
std::bind(std::multiples(),std::placeholders::1,10)
必须包含
()
乘法,而
bind(AddVal2,std::placeholders::1,10)
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));
}
#包括
#包括
#包括
无效附加值2(整数x,整数y)

{std::cout很简单:
std::multiples
是一个类模板,它定义了 函数调用操作符。它看起来像这样:

template <typename T>
struct multiplies {
    // some typedefs are here, too
    T operator()(T const& a0, T const& a1) const { return a0 * a1; }
};
模板
结构乘法{
//这里也有一些typedef
T运算符()(T常量&a0,T常量&a1)常量{返回a0*a1;}
};
要创建这样的对象,您将使用默认构造函数,即
std::multiplies()


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

这很简单:
std::multiplies
是一个定义 函数调用操作符。它看起来像这样:

template <typename T>
struct multiplies {
    // some typedefs are here, too
    T operator()(T const& a0, T const& a1) const { return a0 * a1; }
};
模板
结构乘法{
//这里也有一些typedef
T运算符()(T常量&a0,T常量&a1)常量{返回a0*a1;}
};
要创建这样的对象,您将使用默认构造函数,即
std::multiplies()


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

这很简单:
std::multiplies
是一个定义 函数调用操作符。它看起来像这样:

template <typename T>
struct multiplies {
    // some typedefs are here, too
    T operator()(T const& a0, T const& a1) const { return a0 * a1; }
};
模板
结构乘法{
//这里也有一些typedef
T运算符()(T常量&a0,T常量&a1)常量{返回a0*a1;}
};
要创建这样的对象,您将使用默认构造函数,即
std::multiplies()


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

这很简单:
std::multiplies
是一个定义 函数调用操作符。它看起来像这样:

template <typename T>
struct multiplies {
    // some typedefs are here, too
    T operator()(T const& a0, T const& a1) const { return a0 * a1; }
};
模板
结构乘法{
//这里也有一些typedef
T运算符()(T常量&a0,T常量&a1)常量{返回a0*a1;}
};
要创建这样的对象,您将使用默认构造函数,即
std::multiplies()



另一方面,
AddVal2
是一个函数。要从普通函数中获取函数对象,您只需提及该函数,它就会衰减为函数指针。或者,您也可以使用
&AddVal2
显式获取函数指针(对于成员函数,您必须显式获取地址)看看第一个参数是什么,然后看看你是什么。
std::multiples
是一个类型,
AddVal2
是一个值。看看第一个参数是什么,然后看看你是什么。
std::multiples
是一个类型,
AddVal2
是一个值。看看第一个参数是什么,然后看看你是什么
std::multiples
是一种类型,
AddVal2
是一个值。看看第一个参数是什么,然后看看你是什么。
std::multiples
是一种类型,
AddVal2
是一个值。谢谢!正如你在最后提到的,对于类a的成员函数func(),我需要编写&(a::func)要获取函数指针?@daydayup:您可以使用
&(A::func)
,但是
&A::func
就可以了。当然,如果
A::func
过载,事情会变得有点棘手:您需要选择适当的签名,例如使用强制转换(这同样适用于函数).Hmmm我仍然有点困惑。我觉得std::multiplies()表示运算符()函数,而不是构造函数。@daydayup:nope-您可以使用相同的方法创建一个临时对象,而无需函数调用运算符,例如,
int()
std::string()
。您还可以使用命名对象避免使用括号:
std::multiples m;…std::bind(m,_1,10).
@daydayup-将
()
应用于类型名称意味着您正在调用构造函数。将
()
应用于变量意味着您正在调用
运算符()
(除非变量是函数指针,在这种情况下,您将调用它指向的任何函数)。如果您编写了
std::multiples()(a,b)
,那么您将首先调用构造函数,然后调用
操作符()
。但是您肯定不想在
std::bind
中这样做。谢谢!正如您在最后提到的,对于类a的成员函数func(),我需要编写&(a::func)来获取函数指针?@daydayup:您可以使用
&(a::func)
但是
&A::func
可以。当然,如果
A::func
过载,事情会变得有点棘手:您需要选择适当的签名,例如使用强制转换(这同样适用于函数)。嗯,我仍然有点困惑。我觉得std::multiples()代表运算符()函数,但不是构造函数。@daydayup:nope-您可以创建一个临时对象w