Как вы передаете объекты boost :: bind в функцию? - PullRequest
11 голосов
/ 25 июня 2009

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

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

Ответы [ 4 ]

17 голосов
/ 25 июня 2009

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

4 голосов
/ 25 июня 2009

Я бы определил minimal () таким образом:

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

Тогда вы могли бы вызвать minimal () так:

minimize(boost::bind(&class::function,actual_object,_1,_2,_3,...));
3 голосов
/ 25 июня 2009

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

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

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

1 голос
/ 25 июня 2009

Во-первых, вы принимаете аргумент шаблона как ref-to-non-const, поэтому временное повторное использование метода 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 :: function (а не сложным возвращением типа связывания), но я не на 100%

...