如何确定 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
来显式获取函数指针(对于成员函数,您 有 来显式获取地址)。
我正在使用 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
来显式获取函数指针(对于成员函数,您 有 来显式获取地址)。