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迭代器