Как вы передаете 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? Есть ли простой шаблон для этого, который позволяет избежать шаблона функторов, но допускает множественное связывание параметров?

Ответ 1

Вы можете просто использовать 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.

Ответ 2

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

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

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

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));

Ответ 3

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

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

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

Ответ 4

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

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

Но если вы хотите использовать это с вашими Фунтерами, им придется иметь оператор const(). Поэтому, пожалуй, лучше:

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

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