2010-10-14 1 views
3

У меня есть (библиотека API, так что я не могу изменить прототип функции) функции, которая записывается следующим образом:C++ - функция связывания

void FreeContext(Context c); 

Теперь, в каком-то момент моем исполнении I есть Context* local_context; переменная, и это также не подлежит изменению.

Я хотел бы использовать boost::bind с FreeContext функции, но мне нужно, чтобы получить Context из локальной переменной Context*.

Если я пишу свой код следующим образом, компилятор говорит, что это «незаконным окольные»:

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

мне удалось решить эту проблему следующим образом:

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

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

Но это решение кажется мне не очень хорошим. Любые идеи о том, как решить это, используя что-то вроде *_1. Может быть, написать небольшую лямбда-функцию?

+1

Вы пробовали Boost.Lambda? – kennytm

ответ

4

Вы можете использовать Boost.Lambda, которые перегрузили оператора * для _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; 
} 
2

Используйте либо Boost.Lambda или Boost.Phoenix иметь рабочую operator* на заполнителем.

1

Вы можете также поместить указатель Context в shared_ptr с настраиваемой Deleter:

#include <memory> // shared_ptr 

typedef int Context; 

void FreeContext(Context c) 
{ 
    printf("%d\n", c); 
} 

int main() 
{ 
    Context x = 5; 
    Context* local_context = &x; 

    std::shared_ptr<Context> context(local_context, 
            [](Context* c) { FreeContext(*c); }); 
} 

Не уверен, что это отношение, хотя. Удачи!

+1

Лямбда-выражение поддерживается только в C++ 0x. – kennytm

+0

@KennyTM: Да, Кенни, это так. –