Как вы передаете 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%