C ++ - обязательная функция - PullRequest
3 голосов
/ 14 октября 2010

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

void FreeContext(Context c);

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 14 октября 2010

Вы можете использовать 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 голосов
/ 14 октября 2010

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

1 голос
/ 14 октября 2010

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

#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); });
}

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

...