如何将一个函数绑定到其他函数

时间:2010-07-22 15:20:39

标签: c++ function stl binding predicate

我有一个函数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

2 个答案:

答案 0 :(得分:3)

作为compose中缺少std高阶函数的简单解决方法:

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包装它们。

答案 1 :(得分:1)

我不相信STL的绑定功能足以满足您的需求。