Search code examples
c++pointersfunctionboostboost-bind

C++ - binding function


I have some (library API, so I can't change the function prototype) function which is written the following way:

void FreeContext(Context c);

Now, at some moment of my execution I have Context* local_context; variable and this is also not a subject to change.

I wish to use boost::bind with FreeContext function, but I need to retrieve Context from local variable Context*.

If I write my code the following way, the compiler says it's "illegal indirection":

boost::bind(::FreeContext, *_1);

I managed to solve this problem the following way:

template <typename T> T retranslate_parameter(T* t) {
   return *t;
}

boost::bind(::FreeContext,
            boost::bind(retranslate_parameter<Context>, _1));

But this solution doesn't seem really good to me. Any ideas on how to solve this using something like *_1. Maybe writing a small lambda function?


Solution

  • You could use Boost.Lambda which have overloaded the * operator for _n.

    #include <boost/lambda/lambda.hpp>
    #include <boost/lambda/bind.hpp>
    #include <algorithm>
    #include <cstdio>
    
    typedef int Context;
    
    void FreeContext(Context c) {
        printf("%d\n", c);
    }
    
    int main() {
        using boost::lambda::bind;
        using boost::lambda::_1;
    
        Context x = 5;
        Context y = 6;
        Context* p[] = {&x, &y};
    
        std::for_each(p, p+2, bind(FreeContext, *_1));
    
        return 0;
    }