【问题标题】:how to bind one function to other如何将一个功能绑定到另一个
【发布时间】:2010-07-22 15:20:39
【问题描述】:

我有一个函数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,它显式执行绑定操作。

【问题讨论】:

  • 也许一个更具体的例子会有所帮助......
  • 为什么选择社区维基? (顺便说一句,为清楚起见,请显示 A、B 和 C 的函数声明。)
  • int count(vector a, pred func);//这个函数统计所有满足条件的元素 int lastdigit(int x);//这个函数输出最后一位数字(十进制) of number x bool isodd(int x);//这个函数告诉如果数字 x 是奇数我想找到一个向量中所有这些数字的计数,它的最后一位数字是奇数所以我想要类似 count(vector a, bind(lastdigit,isodd)) 如果我不清楚请告诉我
  • @KennyTM:这样每个人都可以在某个地方出现问题时进行编辑,从而增强它,并最终保持一切就绪

标签: c++ function stl binding predicate


【解决方案1】:

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

【讨论】:

  • 这是一个很棒的回复,我很想知道你是做什么的。我开始相信它不能用 stl 完成,我必须尽快切换到 boost。顺便说一句,我现在在想为什么 stl 不提供 compose 功能。我还搜索了 boost::compose 并了解了它已被弃用并想知道为什么会这样。
  • @mukul:标准库没有它,因为坦率地说,它的设计在功能方面很糟糕。 Boost.Bind 更通用和更具表现力的性质甚至消除了对 compose 函子的需要。
  • 你们在这里很棒。看起来不会有任何问题的答案是该网站的用户没有的。做得好。脱帽致敬。并感谢大家如此迅速地给出如此漂亮的回复
  • @GMan:它没有解释为什么 STL 没有compose,也没有transform_iterator。我发现 boost::bind 仅用于函数编写是不自然的。
  • @Alexandre:糟糕的库设计 -> 缺乏功能。
【解决方案2】:

我认为 STL 的绑定函数不足以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2021-05-16
    • 2020-02-20
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多