2010-07-22 16 views
1

我有一个函数A,它接受一个谓词函数作为它的参数。
我有另一个功能B,它需要一个char并返回一个int和功能C接受int并返回一个bool如何将一个函数绑定到其他

我的问题是如何绑定BC将它传递到功能A

喜欢的东西:

A(bindfunc(B,C)) 

我知道boost::bind的作品,但我期待的STL的解决方案。

例如,

int count(vector<int> a, pred func); // A 
//this functions counts all elements which satisfy a condition 
int lastdigit(int x);     // B 
//this function outputs last digit(in decimal notation) of number x 
bool isodd(int x);      // C 
//this function tells if number x is odd 

// i want to find the count of all such numbers in a vector whose last digit is odd 
// so i want something like 
count(vector<int> a, bind(lastdigit, isodd)) 

一个糟糕的方式是使冗余功能D其中明确进行绑定操作。

+1

也许更具体的例子会帮助... – Cogwheel 2010-07-22 15:24:43

+0

为什么社区wiki? (顺便说一下,要清楚,请显示A,B和C的函数声明) – kennytm 2010-07-22 15:44:16

+0

int count(vector a,pred func); //此函数计算满足条件的所有元素 int lastdigit(int x ); //这个函数输出编号为x的最后一位数字(十进制表示法) bool isodd(int x); //这个函数告诉x是否为奇数 我想查找所有这样的数字在矢量最后的数字是奇数 所以我要像数(矢量一个,绑定(lastdigit,ISODD)) 请让我知道,如果我不明白 – mukul 2010-07-22 15:49:34

回答

3

正如std一个简单的解决方法缺乏compose高阶功能:

template <typename F1, typename F2> 
struct composer : 
    std::unary_function 
    < 
     typename F2::argument_type, 
     typename F1::result_type 
    > 
{ 
    composer(F1 f1_, F2 f2_) : f1(f1_), f2(f2_) {} 

    typename F1::result_type 
    operator()(typename F2::argument_type x) 
    { return f1(f2(x)); } 

private: 
    F1 f1; 
    F2 f2; 
}; 

template <typename F1, typename F2> 
composer<F1, F2> compose(F1 f1, F2 f2) 
{ return composer<F1, F2>(f1, f2); } 

注意,它并不适用于二元函数的工作(更多的工作是参与),而你的函数必须是STL函数对象。这意味着如果你有函数指针,你必须用std::ptr_fun来包装它们。

+0

这是一个很棒的回复,我很想知道你在做什么。我开始相信它不能用stl来完成,我必须尽快转换为提升。顺便说一句,我现在想为什么stl不提供撰写功能。我也搜索了boost :: compose,并了解它的弃用和想知道为什么如此。 – mukul 2010-07-22 16:25:36

+0

@mukul:标准库没有它,因为坦率地说,它的设计在功能性方面很糟糕。 'Boost.Bind'更具通用性和表达性,甚至不需要编写函子。 – GManNickG 2010-07-22 16:36:46

+0

你这里的人很棒。看起来像没有任何问题,这个网站的用户没有答案。做得好。帽子掉了。 并感谢所有人提供这样漂亮的回复,所以很快 – mukul 2010-07-22 16:42:51

1

我不相信STL的绑定函数足够满足您的需求。

相关问题