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.
boost::bind is a generalization of the standard functions std::bind1st and std::bind2nd. It supports arbitrary function objects, functions, function pointers, and member function pointers, and is able to bind any argument to a specific value or route input arguments into arbitrary positions.
std::bind. Returns a function object based on fn , but with its arguments bound to args . Each argument may either be bound to a value or be a placeholder: - If bound to a value, calling the returned function object will always use that value as argument.
The short answer is: you don't need to know (implementation defined). It is a bind expression (std::tr1::is_bind_expression<T>::value
yields true for the actual type).
Look at
std::tr1::function<>
decltype()
can help you move furtherstd::tr1::function<int> f; // can be assigned from a function pointer, a bind_expression, a function object etc int realfunc(); int realfunc2(int a); f = &realfunc; int dummy; f = tr1::bind(&realfunc2, dummy);
BOOST_AUTO() aims to support the semantics of c++0x auto without compiler c++0x support:
BOOST_AUTO(f,boost::bind(&T::some_complicated_method, _3, _2, "woah", _2));
Essentially the same but with compiler support:
template <class T> struct DoWork { /* ... */ }; auto f = boost::bind(&T::some_complicated_method, _3, _2, "woah", _2)); DoWork<decltype(T)> work_on_it(f); // of course, using a factory would be _fine_
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With