在functional>中有关于函数组合的东西吗?

Is there something for function composition in <functional>?

本文关键字:组合 函数 functional 于函数      更新时间:2023-10-16

我想做的是很容易完成c++ 0x lambdas。我只是想弄清楚如何只处理bind1stbind2nd

我需要在向量v中找到第一个元素i,这样(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()编写独立的一元函数或结构体等变通方法。我对函数中的函子力学以及bind1stbind2nd非常感兴趣。这不是为了真正的代码,只是为了兴趣。谢谢:)

不幸的是,仅使用当前的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);

如果你可以在等式的左边拉出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的答案就是你的选择。