boost::not1(boost::bind(...))
This does not seem to work, because the object bind returns does not have an argument_type typedef. Why is that so? Is there a workaround? Thx, Agoston
Agoston Bejo wrote:
This does not seem to work, because the object bind returns does not have an argument_type typedef. Why is that so?
Because the function objects created by bind do not have a fixed argument type.
Is there a workaround?
For now, please use bind( logical_not<bool>(), bind( ... ) ).
[Platform: VC++7.1 (I always forget to mention this, only that's why I added it now.)] Actually what you have suggested is one of the two workarounds I came accross when googling the net. The other one was this (IMHO it would be slightly more elegant if it worked): cout << *find_if(ia, ia+5, boost::not1( make_adaptable<bool, int>(bind(equ, _1, 1)))) << endl; But it generated an error. (I separated the first - and thus most relevant, I suspect - part of the error message from the rest for better readibility.) It is quite cryptic for me. It's strange that it does not refer to the above line in the source, only to boost/functional.hpp. (Although it is obviously that line that causes this mess, because commenting out makes the program correctly compilable.) Can this be a sign of broken implementation? The error message: C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\boost\functional.hpp(167) : error C3848: expression having type 'const boost::unary_traits<Operation>::function_type' would lose some const-volatile qualifiers in order to call 'boost::_bi::af1<R,A1,F>::result_type boost::_bi::af1<R,A1,F>::operator ()(A1)' with [ Operation=boost::_bi::af1<bool,int,boost::_bi::bind_t<bool,bool (__cdecl *)(int,int),boost::_bi::list2<boost::_bi::list_av_2<boost::arg<1>,int>::B1,b oost::_bi::list_av_2<boost::arg<1>,int>::B2>>> ] and [ R=bool, A1=int, F=boost::_bi::bind_t<bool,bool (__cdecl *)(int,int),boost::_bi::list2<boost::_bi::list_av_2<boost::arg<1>,int>::B1,b oost::_bi::list_av_2<boost::arg<1>,int>::B2>> ] -------------------------------------------- c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\boost\functional.hpp(166) : while compiling class-template member function 'bool boost::unary_negate<Predicate>::operator ()(const boost::call_traits<T>::param_type) const' with [ Predicate=boost::_bi::af1<bool,int,boost::_bi::bind_t<bool,bool (__cdecl *)(int,int),boost::_bi::list2<boost::_bi::list_av_2<boost::arg<1>,int>::B1,b oost::_bi::list_av_2<boost::arg<1>,int>::B2>>>, T=boost::unary_traits<boost::_bi::af1<bool,int,boost::_bi::bind_t<bool,bool (__cdecl *)(int,int),boost::_bi::list2<boost::_bi::list_av_2<boost::arg<1>,int>::B1,b oost::_bi::list_av_2<boost::arg<1>,int>::B2>>>>::argument_type ] d:\prog\vcpp\Boost\xNot1Bind\xNot1Bind.cpp(24) : see reference to class template instantiation 'boost::unary_negate<Predicate>' being compiled with [ Predicate=boost::_bi::af1<bool,int,boost::_bi::bind_t<bool,bool (__cdecl *)(int,int),boost::_bi::list2<boost::_bi::list_av_2<boost::arg<1>,int>::B1,b oost::_bi::list_av_2<boost::arg<1>,int>::B2>>> ] "Peter Dimov" <pdimov@mmltd.net> wrote in message news:006501c4e430$541a0110$6401a8c0@pdimov2...
Agoston Bejo wrote:
This does not seem to work, because the object bind returns does not have an argument_type typedef. Why is that so?
Because the function objects created by bind do not have a fixed argument type.
Is there a workaround?
For now, please use bind( logical_not<bool>(), bind( ... ) ).
Agoston Bejo wrote:
[Platform: VC++7.1 (I always forget to mention this, only that's why I added it now.)]
Actually what you have suggested is one of the two workarounds I came accross when googling the net. The other one was this (IMHO it would be slightly more elegant if it worked):
cout << *find_if(ia, ia+5, boost::not1( make_adaptable<bool, int>(bind(equ, _1, 1)))) << endl;
But it generated an error.
Compiles here (but the linker dies with an internal error ;-) ). Which version of Boost are you using? (Please post complete programs in the future. Thanks in advance.)
Boost 1.32 (I've downloaded it last week or so). On the bottom you can find the complete program. (In other newsgroups I often saw people complaining about having to read the whole source code - I suppose they didn't mean minimal examples, am I right?) "Peter Dimov" <pdimov@mmltd.net> wrote in message news:004001c4e470$902ee900$6601a8c0@pdimov...
Agoston Bejo wrote:
[Platform: VC++7.1 (I always forget to mention this, only that's why I added it now.)]
Actually what you have suggested is one of the two workarounds I came accross when googling the net. The other one was this (IMHO it would be slightly more elegant if it worked):
cout << *find_if(ia, ia+5, boost::not1( make_adaptable<bool, int>(bind(equ, _1, 1)))) << endl;
But it generated an error.
Compiles here (but the linker dies with an internal error ;-) ). Which version of Boost are you using?
(Please post complete programs in the future. Thanks in advance.)
There it goes: -------------------------------------------------- // xNot1Bind.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <boost/bind.hpp> #include <boost/bind/make_adaptable.hpp> #include <boost/functional.hpp> using namespace std; using namespace boost; bool equ(int i, int j) { return i == j; } int _tmain(int argc, _TCHAR* argv[]) { int ia[] = {1,2,3,4,5}; // cout << *find_if(ia, ia+5, boost::not1(bind(equ, _1, 1))) << endl; // cout << *find_if(ia, ia+5, bind( // logical_not<bool>(), bind(equ, _1, 1) ) ); cout << *find_if(ia, ia+5, boost::not1( make_adaptable<bool, int>(bind(equ, _1, 1)))) << endl; return 0; } -------------------------------------------------
Agoston Bejo wrote:
Boost 1.32 (I've downloaded it last week or so).
On the bottom you can find the complete program. (In other newsgroups I often saw people complaining about having to read the whole source code - I suppose they didn't mean minimal examples, am I right?)
Probably. :-) I had to remove the include of "stdafx.h", add one for <algorithm>, and change to int main() With these changes, it gives me an output of '2'. I'm always using the CVS version of Boost, but there've been no changes post-1.32 to Bind or functional.hpp. make_adaptable was indeed missing const operator() overloads in Boost 1.31, though.
participants (2)
-
Agoston Bejo
-
Peter Dimov