I want to save the “binder” of a function to a variable, to use it repetitively in the following code by exploiting its operator overloading facilities. Here is the code that actually does what I want:
#include <boost/bind.hpp>
#include <vector>
#include <algorithm>
#include <iostream>
class X
{
int n;
public:
X(int i):n(i){}
int GetN(){return n;}
};
int main()
{
using namespace std;
using namespace boost;
X arr[] = {X(13),X(-13),X(42),X(13),X(-42)};
vector<X> vec(arr,arr+sizeof(arr)/sizeof(X));
_bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);
cout << "With n =13 : "
<< count_if(vec.begin(),vec.end(),bindGetN == 13)
<< "\nWith |n|=13 : "
<< count_if(vec.begin(),vec.end(),bindGetN == 13 || bindGetN == -13)
<< "\nWith |n|=42 : "
<< count_if(vec.begin(),vec.end(),bindGetN == 42 || bindGetN == -42)
<< "\n";
return 0;
}
What bothers me is, of course, the line:
bi::bind_t<int, _mfi::mf0<int, X>, _bi::list1<arg<1> > > bindGetN = bind(&X::GetN,_1);
I’ve obtained the type just by deliberately making a type error and analysing the error message. That is certainly not a good way to go. Is there a way to obtain the type for the “bindGetN”? Or, maybe there are different ways to produce similar functionality?
Edit: I forgot to mention that the, so to say, “standard” suggestion to use function is not working in this case — because I’d like to have my operator overloading.
The short answer is: you don’t need to know (implementation defined).
It is a bind expression (
std::tr1::is_bind_expression<T>::valueyields true for the actual type).Look at
std::tr1::function<>decltype()can help you move further1.
2.
BOOST_AUTO() aims to support the semantics of c++0x auto without compiler c++0x support:
3.
Essentially the same but with compiler support:
Note that auto has probably been invented for this kind of situation: the actual type is a ‘you don’t want to know’ and may vary across compilers/platforms/libraries