я имел вид на приведенные ниже ссылки:bind1st и bind2nd
, что я не понимаю, разница между этими двумя. Может ли кто-нибудь помочь мне узнать разницу. Пример был бы более полезным.
я имел вид на приведенные ниже ссылки:bind1st и bind2nd
, что я не понимаю, разница между этими двумя. Может ли кто-нибудь помочь мне узнать разницу. Пример был бы более полезным.
bind1st
связывает первый аргумент (например, у Вас есть foo(int a, int b)
, то bind1st(foo, 1)(bar)
будет эквивалентно foo(1, bar)
), bind2nd
второй. Не используйте их, хотя они почти бесполезны - вместо этого используйте обобщенный boost::bind
(или std::bind
в C++ 0x).
Предположим, у вас есть объект функции f(x,y)
и алгоритм, который нуждается в функтоиде только с одной переменной. Тогда есть две возможности:
y
и пусть работу алгоритма на x
x
и пусть работу алгоритма на y
Это разница.
Это очевидно. bind1st
связывает значение с первым операндом функтора (при условии, что вы знаете, что такое функтор в C++), bind2nd
ко второму. Но для коммутативных операторов как +
(или std::plus
) это фактически не имеет значения (если вы не перегружали +
с некоммутативным поведением в этом примере).
bind1st связывает первый параметр функции, а bind2nd связывает второй параметр. если работать с функцией plus(), то это не имеет никакого значения, поскольку добавление двух чисел остается одинаковым в обоих случаях, но если u работает как minus(), то это имеет значение в зависимости от u, используя bind1st или bind2nd, пример 5- 4 и 4-5 будут генерировать разные результаты, теперь вы получили разницу между привязкой первого параметра bind1st и привязкой второго привязки bind2nd.
Если у вас нет C++ 0x или вы не хотите прикладывать повышенную зависимость, они приходят очень удобно. –
у них было предельное использование для унарных предикатов ... однако согласовано, если вы хотите, чтобы функтор использовал 'boost :: function' в сочетании с' boost :: bind' – AJG85
@ChristianRau: Вот почему я сказал «почти» не «полностью», бесполезный. Хотя избегать Boost просто контрпродуктивно. –