Используя только примитивы, предоставленные в стандартных библиотеках, это на самом деле удивительно сложно, потому что связующие, предоставляемые bind1st
и bind2nd
, не позволяют вам составлять функции. В данном конкретном случае вы пытаетесь проверить, если
x % 2 == 1
Что, если учесть, как работают примитивы <functional>
, эквивалентно
equal_to(modulus(x, 2), 1)
Проблема в том, что компоненты в <functional>
не позволяют очень легко передавать выходные данные одной функции в качестве входных данных для другой функции. Вместо этого вам придется полагаться на какую-то другую технику. В этом случае вы можете обмануть, используя два последовательных приложения not1
:
not1(not1(bind2nd(modulus<int>(), 2)))
Это работает, потому что это эквивалентно
!!(x % 2)
Если x четное, то это !!0
, что составляет false
, а если x нечетное, это !!1
, что составляет true
. Причина двойной фильтрации через not1
состоит в том, чтобы гарантировать, что результат имеет тип bool
, а не int
, так как
bind2nd(modulus<int>(), 2)
- это функция, которая выдает int
вместо bool
, который вы хотите.