Есть ли что-то для композиции функций в <functional>? - PullRequest
5 голосов
/ 19 июля 2011

То, что я хочу сделать, довольно легко сделать с помощью C ++ 0x lambdas.Я просто хочу выяснить, как это сделать только с bind1st и bind2nd.

Мне нужно найти первый элемент i в векторе v, такой, что (i-1)/p1 == p2 где p1и p2 - предопределенные целые числа.

find_if(v.begin(), v.end(), ???)

Я не могу понять, как сформировать предикат с minus<int> divides<int> equal_to<int> и bind2nd.Похоже, мне нужна некоторая композиция функций

equal(div(minus(i, 1), p1), p2)

Возможно ли это?

Пожалуйста, не предлагайте обходных путей, таких как написание автономной унарной функции или структуры с operator().Я действительно интересуюсь механикой функторов в функционале наряду с bind1st и bind2nd.Это не для реального кода, просто интерес.Спасибо :)

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

К сожалению, то, что вы пытаетесь сделать, невозможно только с текущей библиотекой functional. Вам нужно создать свой собственный класс или функцию для создания композиции.

Boost раньше предлагал библиотеку Compose, которая использовалась для составления подобных функций, но я думаю, что она была удалена, когда были представлены Bind и Lambda.

И просто ради завершения, это можно сделать с помощью bind, используя что-то вроде:

std::bind(std::equal_to<int>(), /* ... == P2 */
    std::bind(std::divides<int>(), /* ... / P1 == P2 */
        std::bind(std::minus<int>(), _1, 1), /* (x - 1) / P1 == P2 */
    p1), 
p2);
0 голосов
/ 20 июля 2011

Если вы можете потянуть i в левой части уравнения, то вам не нужно вообще сочинять, я думаю.i.e. i == p1*p2+1.

  1 #include <iostream>
  2 #include <functional>
  3 #include <algorithm>
  4 #include <vector>
  5 using namespace std;
  6 
  7 int main ()
  8 {
  9 
 10     vector<int> numbers;
 11     for(int i = 0;i< 10;i++) {
 12        numbers.push_back(i+20);
 13     }
 14 
 15 int p1=4,p2=5;
 16 vector<int>::iterator iter;
 17 
 18 iter = find_if ( numbers.begin(), numbers.end(), bind2nd(equal_to<int>(),p1*p2+1));
 19 cout << "The number is "<< *iter <<"\n";
 20 return 0;
 21 }

Но если вы настаиваете на том, чтобы составить свое выражение лица, то ответ @ dauphic - тот, на который стоит пойти.

...