# Basic Things worth Knowing About Bind Adapter

One of the new features that I really enjoy with C++11 is the *bind* adapter, because there are so many thing that you could do with it and it really makes your life simpler. For example, how many time we need to add a value to a collection. For example in our programming environment we have a library of C function that perform some mathematical operation and want to use it with stl algorithm for example.

Below I show some basic applications of everyday life programmer.

Before C++11 we had those 2 adapter ** bind1st **and

**, which take a binary function and treat it as unary function. Now these are deprecated and we have the bind adapter but still can achieve the same operation and more.**

*bind2nd*Initialize vector with list initializer (boost assign library)

std::vector<int> range1 = list_of(-1)(2)(5)(6)(-3); std::vector<int> w_res; //store result w_res.reserve(5); |

In the example below I subtract each element of the collection by some values. I use the pre-defined function object std::minus (binary function operator () (arg1,arg2)). First I want to perform the following operation: agr1 – arg2 (bind first argument arg1=constant). With the bind adapter we can define on-the-fly a function object with first argument binded. We can use it with the transform algorithm of the stl which take a unary function

### Bind the first argument (bind1st )

Define a binary function and initialize it with bind adapter (same as bind1st which is now deprecated since C++11)

auto w_minusBind1st = std::bind(std::minus<int>(),1,_1);// apply function to data std::transform( range1.begin(),range1.end(),std::back_inserter(w_res), w_minusBind1st); |

In the next example I want to perform the following (arg2-constant), mean that we are binding the second argument to a constant.

### Bind the second argument (bind2nd )

Define a binary function and initialize it (same as bind2nd which is now deprecated since C++11)

auto w_minusBind2nd = std::bind(std::minus<int>(),_1,1); // stl algorithm std::transform(range1.begin(),range1.end(),std::back_inserter(w_res), w_minusBind2nd); |

In the next example I want to pass it as a function argument (very handful when prototyping, just want to try something and see what the result is).

### Pass it as a function argument

Define a binary function that takes as argument a binary function and returns an integer. We use “function”, newly added to C++11.

typedef std::function<int(int,int)> BinaryFunc;
void myTestStdFunc( BinaryFunc aBfunc) |

Initialize a binary function using the bind mechanism (on-the-fly). “Plus” is pre-defined binary function that has the same signature the “BinaryFunc” defined above and then pass as argument

auto w_plusbind2nd = std::bind( std::plus<int>(), _1,_2);
myTestStdFunc( w_plusbind2nd); // call function |

Isn’t nice can make some construct on-the-fly and test it right away. It’s something that I do almost every day as a scientific programmer. Usually those functions are mathematical algorithm and we may want to validate their behavior or result.

### Writing my own function object)

You can even use some function of your library. In our programming environment we have a library of function that performs math operation (signature like C-function). In many situations we want to test with some values, again bind can be used to fine tune your test. We have the following function prototype.

## Leave a Reply

Want to join the discussion?Feel free to contribute!