I’m trying to use boost::bind and boost::function with std::logical_not and I’ve run into some strange template magic that I don’t understand.  In the example below, I use boost::function to help compose several boost::bind calls so that I don’t have to do it all on one line (I find that this improves readability).  The problem is that when I do this, the functions that are bound with boost::bind never get called.  They will get called only if I construct everything on one line.   (???)

 

Is this expected behavior?  If so, why does it work like this?

 

 

Thanks,

aaron

 

 

 

#include <algorithm>

#include <functional>

#include "boost/bind.hpp"

#include "boost/function.hpp"

 

using namespace std;

using namespace boost;

 

class test {

public:

    void bindtest() {

        // test1: composed gradually for clarity

        //

        function<bool ()> funcFoo  = bind(&test::foo, this);

        function<bool ()> funcBar  = bind(&test::bar, this);

        function<bool ()> funcTest1= bind(logical_and<bool>(), funcFoo, funcBar);

 

        // doesn't call test::foo or test::bar! (returns true)

        bool test1= funcTest1();

        cout << "test1= " << test1 << endl;

 

        // test2: composed directly on one line

        function<bool ()> funcTest2= bind(logical_and<bool>(),

                                          bind(&test::foo, this),

                                          bind(&test::bar, this) );

 

        // calls test::foo and test::bar (returns false)

        bool test2= funcTest2();

        cout << "test2= " << test2 << endl;

    }

 

    bool foo()

    {

        cout << "foo" << endl;

        return false;

    }

 

    bool bar()

    {

        cout << "bar" << endl;

        return false;

    }

};