C++ 如何将一个函数绑定到另一个函数

C++ 如何将一个函数绑定到另一个函数,c++,function,stl,binding,predicate,C++,Function,Stl,Binding,Predicate,我有一个函数a,它接受一个谓词函数作为它的参数。 我有另一个函数B,它接受char并返回int,还有一个函数C接受int并返回bool 我的问题是如何绑定B和C以将其传递给函数A 比如: A(bindfunc(B,C)) 我知道boost::bind有效,但我正在寻找STL解决方案 比如说, int count(vector<int> a, pred func); // A //this functions counts all elements which satisfy

我有一个函数
a
,它接受一个谓词函数作为它的参数。
我有另一个函数
B
,它接受
char
并返回
int
,还有一个函数
C
接受
int
并返回
bool

我的问题是如何绑定
B
C
以将其传递给函数
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))
int计数(向量a,pred func);//A.
//此函数统计满足条件的所有元素
整数最后一位数(整数x);//B
//此函数输出数字x的最后一位数字(十进制表示法)
bool isodd(int x);//C
//此函数用于判断数字x是否为奇数
//我想求最后一位为奇数的向量中所有这些数字的计数
//所以我想要像这样的东西
计数(向量a,绑定(最后一位,isodd))

一个不好的方法是创建一个显式执行绑定操作的冗余函数。

我不认为STL的绑定函数足够通用,可以满足您的需要。

我不认为STL的绑定函数足够通用,可以满足您的需要。

作为一个简单的解决方案,可以解决缺少绑定的问题
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); }
模板
结构编写器:
std::一元函数
<
typename F2::参数类型,
类型名称F1::结果类型
>
{
作曲者(F1,F2):F1(F1),F2(F2){
类型名称F1::结果类型
运算符()(类型名F2::参数类型x)
{返回f1(f2(x));}
私人:
F1;
F2 F2;
};
模板
作曲家作曲(F1、F2)
{返回编写器(f1,f2);}

请注意,它不适用于二进制函数(需要更多的工作),并且您的函数必须是STL函数对象。这意味着如果你有函数指针,你必须用
std::ptr_fun

来包装它们,作为
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); }
模板
结构编写器:
std::一元函数
<
typename F2::参数类型,
类型名称F1::结果类型
>
{
作曲者(F1,F2):F1(F1),F2(F2){
类型名称F1::结果类型
运算符()(类型名F2::参数类型x)
{返回f1(f2(x));}
私人:
F1;
F2 F2;
};
模板
作曲家作曲(F1、F2)
{返回编写器(f1,f2);}

请注意,它不适用于二进制函数(需要更多的工作),并且您的函数必须是STL函数对象。这意味着,如果你有函数指针,你必须用
std::ptr_fun

包装它们,也许一个更具体的例子会有所帮助……为什么要使用社区wiki?(顺便说一句,为了清楚起见,请显示A、B和C的函数声明。)int count(向量A、pred func)//此函数统计满足条件int lastdigit(int x)的所有元素//此函数输出数字x bool isodd(int x)的最后一位数字(十进制表示法)//这个函数告诉我们,如果数字x是奇数,我想在一个最后一个数字是奇数的向量中找到所有这些数字的计数,所以我想要类似计数的东西(向量a,bind(lastdigital,isodd))如果我不在,请告诉我clear@KennyTM:这样每个人都可以编辑并因此在出现问题时对其进行增强,并最终保留所有内容。也许一个更具体的示例会有所帮助……为什么是社区维基?(顺便说一句,为了清楚起见,请显示A、B和C的函数声明。)int count(向量A、pred func)//此函数统计满足条件int lastdigit(int x)的所有元素//此函数输出数字x bool isodd(int x)的最后一位数字(十进制表示法)//这个函数告诉我们,如果数字x是奇数,我想在一个最后一个数字是奇数的向量中找到所有这些数字的计数,所以我想要类似计数的东西(向量a,bind(lastdigital,isodd))如果我不在,请告诉我clear@KennyTM当前位置如果某个地方出了问题,每个人都可以对其进行编辑,从而对其进行增强,并最终保留所有内容。这是一个很棒的回答,我很想知道你是怎么做的。我开始相信stl是做不到的,我很快就要改用boost了。顺便说一句,我现在在想为什么stl不提供合成功能。我还搜索了boost::compose,了解到它已被弃用,并想知道为什么会这样。@mukul:标准库没有它,因为坦率地说,它的设计在功能方面很糟糕<代码>Boost.Bind
更通用、更具表现力的特性甚至消除了编写函子的需要。你们这些人真是太棒了。看来不会有任何问题是这个网站的用户没有答案的。干得好。表达敬意。感谢你们所有人给予如此美丽的回答等等quickly@GMan:它没有解释为什么STL没有
compose
,也没有
transform\u迭代器
。我发现仅仅是编写函数是不自然的。@Alexandre:糟糕的库设计->缺乏功能。这是一个很棒的回答,我很想知道你是怎么做的。我开始相信stl是做不到的,我很快就要改用boost了。顺便说一句,我现在在想为什么stl不提供合成功能。我还搜索了boost::compose,了解到它已被弃用,并想知道为什么会这样。@mukul:标准库没有它,因为坦率地说,它的设计在功能方面很糟糕<代码>Boost.Bind更通用、更具表现力的特性甚至消除了编写函子的需要。你们这些人真是太棒了。看来不会有任何问题是这个网站的用户没有答案的。干得好。表达敬意。感谢你们所有人给予如此美丽的回答等等quickly@GMan:它没有解释为什么STL没有
compose
,也没有
transform\u迭代器