C++标准 bind函数用法与C简单实现 电脑资料
在看C++标准程序库书中,看到bind1st,bind2nd及bind的用法,当时就有一种熟悉感,仔细想了下,是F#里提到的柯里化,
下面来看一个简单的例子。
void mult(int& a, int b)
{
cout << "a:" << a << " b:" << b << endl;
a += b;
}
void test24()
writeline函数{
using namespace std::placeholders;
vector list;
int i = 0;
generaten(backinserter(list), 10, [&i](){
return i++;
});
foreach(list.begin(), d(), bind(mult, 1, 10));
foreach(list.begin(), d(), bind(mult, 100, 1));
copy(list.begin(), d(), ostreamiterator (cout, " "));
}
在这,foreach最后接受一个void fun(int p)的函数做参数,p就是我们的每次遍历的数据,而在这我们用到mult,带有二个参数。在这我们就要用到柯里化,把mult转成前面的void fun(int p)的形式,下面我们看下相应函数如何工作。
我们先来看下bind1st,这个相当于做了如下事。 f(a,b) -> f(a)(b).简单来说,就是把带二个参数的函数变成只带一个参数的函数的过程。bind2nd如上,类似f(a,b)->f(b)(a).而bind的用法更广,不限制个数,参数顺序和函数类型等。上面第一个foreach中bind的用法就相当于bind2nd,第二个就相当于bind1st.
下面再来看个小例子:
void test23()
{
using namespace std::placeholders;
auto func = [](int x, string y){
return tostring(x) + y;
};
auto f = bind(func, 1, 1);
auto fs = bind(func, 1, "xx");
auto fss = bind(func, 3, "xxx");
auto fsss = bind(func, 2, 1);
cout << f("x") << endl;
cout << fs(2) << endl;
cout << fss() << endl;
cout << fsss("xxxx", 4) << endl;
}
输出结果分别是1x,2xx,3xxx,4xxxx.在二个参数的情况下,bind的几种简单重组函数的方法。为了好理解与说明,我直接把对应F#里相应写法写出。
let func x y = x.ToString() + y
let f x = func 1 x
let fs x = func x "xx"
let fss = func 3 "xxx"
let fsss x y = func y x
[ ]
let main argv =
printfn "%s" (f "x")
printfn "%s" (fs 2)
printfn "%s" (fss)
printfn "%s" (fsss "xxxx" 4)
ignore(System.Console.Read())
0 // 返回整数退出代码
F#因为本身就是FP语言,故相应在C++还需要调用外部函数相比,本身内部支持。
如下是对应各变量类型:
val func : x:'a -> y:string -> string
val f : x:string -> string
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论