Как вы передаете объекты boost::bind в функцию?

У меня есть минимизатор одномерной функции. Прямо сейчас я передаю ему указатели на функции. Однако многие функции имеют несколько параметров, некоторые из которых фиксированы. Я реализовал это, используя такие функторы

template <class T>
minimize(T &f) {
}

Functor f(param1, param2);
minimize<Functor>(f);

Однако в определении функтора много хлама. Boost::bind выглядит чище. Чтобы я мог сделать:

minimize(boost:bind(f,_1,param1,param2))

Однако я не понимаю, как должна выглядеть моя декларация minimize с использованием boost::bind. Какой тип объекта boost::bind? Существует ли простой шаблон для этого, который позволяет избежать стандартного шаблона функторов, но позволяет привязывать несколько параметров?


person Tristan    schedule 25.06.2009    source источник


Ответы (4)


Вы можете просто использовать boost::function. Я думаю, что boost::bind имеет свой собственный тип возврата, но он совместим с boost::function. Типичное использование - сделать typedef для функции:

typedef boost::function<bool(std::string)> MyTestFunction;

а затем вы можете передать любую совместимую функцию с boost::bind:

bool SomeFunction(int i, std::string s) { return true; }
MyTestFunction f = boost::bind(SomeFunction, 42, _1);
f("and then call it.");

Я надеюсь, что это то, что вы хотите.

Он также работает с методами, передавая указатель this для вызова в качестве второго параметра в boost::bind.

person OregonGhost    schedule 25.06.2009

Я бы определил минимизацию() следующим образом:

minimize(boost::function< return_type(param_type1,param_type2,param_type3,...)> f)
{
    ...
}

Затем вы могли бы вызвать метод Minim() следующим образом:

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));
person J. Polfer    schedule 25.06.2009

Измените параметр на параметр значения. Функциональные объекты преднамеренно легкие, и boost::bind, безусловно, специально созданы, чтобы уместиться в пределах нескольких байтов, используя boost::compressed_pair, а что нет.

template <class T>
void minimize(T f) {
}

Затем вы можете передать ему результат boost::bind. Помните, что boost::bind на самом деле является шаблоном функции, которая возвращает некоторый объект определенного типа. Таким образом, наличие у minimize неконстантного ссылочного параметра не может работать.

person Johannes Schaub - litb    schedule 25.06.2009

Во-первых, вы принимаете свой аргумент шаблона как ref-to-non-const, поэтому временный возврат с помощью boost::bind не будет связываться с ним. Таким образом, вы можете использовать его как:

template <class T>
T::result_type minimize(const T &f) {
}

Но если вы хотите использовать это и со своими функторами, они должны иметь константный оператор(). Так что, возможно, по значению лучше:

 template <class T>
 T::result_type minimize(T f) {
 }

Я считаю, что возвращаемое значение T::result_type заставит T быть boost::function (а не возвращать сложное связывание типов), но я не на 100%

person Todd Gardner    schedule 25.06.2009