Re: [Boost-users] [bind] Template deduction
On Tue, Mar 4, 2008 at 7:16 PM, Marshall Clow <marshall@idio.com> wrote:
Would this work? std::for_each( myStrings.begin(), myStrings.end(), boost::bind( &DoFoo<std::string>, 5, _1 ) );
Well, the example I gave was probably overly simple. The real example uses a boost::python::list, which can either take a char* or a std::string. At the time I'm doing the boost::bind, I do not know what type is being passed in.
On Wed, Mar 5, 2008 at 10:36 AM, Robert Dailey <rcdailey@gmail.com> wrote:
On Tue, Mar 4, 2008 at 7:16 PM, Marshall Clow <marshall@idio.com> wrote:
Would this work? std::for_each( myStrings.begin(), myStrings.end(), boost::bind( &DoFoo<std::string>, 5, _1 ) );
Well, the example I gave was probably overly simple. The real example uses a boost::python::list, which can either take a char* or a std::string. At the time I'm doing the boost::bind, I do not know what type is being passed in.
Below is the real example: //========================================================================================= bool PyInterpreter::SetSystemPath( std::vector<boost::filesystem::path> const& pathList ) { bool success = true; try { using namespace boost::python; list newsyspath; std::for_each( pathList.begin(), pathList.end(), boost::bind( &list::insert<boost::filesystem::path>, newsyspath, 0, _1 ) ); object sys = GetNamespace( "sys" ); sys["path"] = newsyspath; } catch(...) { PyErr_Print(); success = false; assert( 0 ); } return false; } If you examine my std::for_each() above, you'll notice that I'm simply trying to push 'path' objects into boost::python::list, which won't work but it should at least compile. However the MSVC compiler is telling me that boost::bind expects 2 arguments, not 4. What am I doing wrong?
Robert Dailey:
Below is the real example: ...
using namespace boost::python;
list newsyspath;
std::for_each( pathList.begin(), pathList.end(), boost::bind( &list::insert<boost::filesystem::path>, newsyspath, 0, _1 ) );
Unfortunately, list::insert is overloaded, and boost::bind doesn't handle overloaded functions well. See the section "Binding an overloaded function" in http://svn.boost.org/trac/boost/browser/trunk/libs/bind/bind.html?format=raw
On Wed, Mar 5, 2008 at 11:47 AM, Peter Dimov <pdimov@pdimov.com> wrote:
Unfortunately, list::insert is overloaded, and boost::bind doesn't handle overloaded functions well. See the section "Binding an overloaded function" in
http://svn.boost.org/trac/boost/browser/trunk/libs/bind/bind.html?format=raw
Ah, that was the problem! I didn't know list::insert was overloaded. Too bad the compiler errors generated by boost::bind aren't very helpful. C++0x will definitely fix that issue later on though! Thanks for the help.
Robert Dailey wrote:
On Wed, Mar 5, 2008 at 10:36 AM, Robert Dailey <rcdailey@gmail.com <mailto:rcdailey@gmail.com>> wrote:
On Tue, Mar 4, 2008 at 7:16 PM, Marshall Clow <marshall@idio.com <mailto:marshall@idio.com>> wrote:
Would this work? std::for_each( myStrings.begin(), myStrings.end(), boost::bind( &DoFoo<std::string>, 5, _1 ) );
Well, the example I gave was probably overly simple. The real example uses a boost::python::list, which can either take a char* or a std::string. At the time I'm doing the boost::bind, I do not know what type is being passed in.
Below is the real example:
//========================================================================================= bool PyInterpreter::SetSystemPath( std::vector<boost::filesystem::path> const& pathList ) { bool success = true;
try { using namespace boost::python;
list newsyspath;
std::for_each( pathList.begin(), pathList.end(), boost::bind( &list::insert<boost::filesystem::path>, newsyspath, 0, _1 ) );
object sys = GetNamespace( "sys" ); sys["path"] = newsyspath; }
catch(...) { PyErr_Print(); success = false; assert( 0 ); }
return false; }
did you try: std::copy( pathList.begin(), pathList.end() , std::back_inserter(list) ); Jeff Flinn
A template is only a pattern not code, DoFoo cannot be bound to because it doesn't exist so you can't do what you want, for more details have a look here : http://www.parashift.com/c++-faq-lite/templates.html#faq-35.15. Do you really need a template function for this, just overload a function with one converting the char* into a std::string or visa versa ________________________________ From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Robert Dailey Sent: 05 March 2008 16:37 To: boost-users@lists.boost.org Subject: Re: [Boost-users] [bind] Template deduction On Tue, Mar 4, 2008 at 7:16 PM, Marshall Clow <marshall@idio.com> wrote: Would this work? std::for_each( myStrings.begin(), myStrings.end(), boost::bind( &DoFoo<std::string>, 5, _1 ) ); Well, the example I gave was probably overly simple. The real example uses a boost::python::list, which can either take a char* or a std::string. At the time I'm doing the boost::bind, I do not know what type is being passed in. ______________________________________________________________________ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email ______________________________________________________________________ ****************************************************************************** "This message and any attachments are solely for the intended recipient and may contain confidential and privileged information. If you are not the intended recipient, any disclosure, copying, use, or distribution of the information included in this message and any attachments is prohibited. If you have received this communication in error, please notify us by reply e-mail and immediately and permanently delete this message and any attachments. Thank you." Interactive Transaction Solutions Ltd (2473364 England) Registered Office: Systems House, Station Approach Emsworth PO10 7PW ********************************************************************** Ce message �lectronique contient des informations confidentielles � l'usage unique des destinataires indiqu�s, personnes physiques ou morales. Si vous n'�tes pas le destinataire voulu, toute divulgation, copie, ou diffusion ou toute autre utilisation de ces informations, est interdite. Si vous avez re�u ce message �lectronique par erreur, nous vous remercions d'en avertir son exp�diteur imm�diatement par email et de d�truire ce message ainsi que les �l�ments attach�s. Interactive transaction Solutions SAS- France (RCS Pontoise : 489 397 877) Si�ge social : Parc Saint Christophe, 10, Avenue de l�Entreprise 95865 Cergy-Pontoise Cedex ______________________________________________________________________ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email ______________________________________________________________________
On Wed, Mar 5, 2008 at 10:45 AM, Patrick Loney < Patrick.Loney@interactivets.com> wrote:
Do you really need a template function for this, just overload a function with one converting the char* into a std::string or visa versa
Read my posts above.
participants (4)
-
Jeff Flinn
-
Patrick Loney
-
Peter Dimov
-
Robert Dailey