绑定不是值,而是一个函数(获取此函数的值)

时间:2012-02-01 11:36:43

标签: c++ binding functor

假设我有以下功能:

int foo (int a)
{
  return something;
}

我该怎么办?

vector<int> v;

std::for_each( v.begin(), v.end(), std::bind1st(std::minus<int>(), foo) );

我想要这样工作:for_each将当前元素传递给仿函数,仿函数调用foo然后减去传递的向量元素和调用foo的结果。是否有可能只使用std,而不是使用boost或自编写的函子?

2 个答案:

答案 0 :(得分:2)

这有点可怕但是在C ++ 11中......

#include <vector>
#include <functional>
#include <algorithm>

int foo(int a) 
{
    return a;
}

int operator-(int b, std::function<int(int)> a)
{
    return b - a(b);
}

int main()
{
    std::vector<int> v = {1,2,3,4,5};
    std::for_each( v.begin(), v.end(), std::bind((int(*)(int, std::function<int(int)>))(&operator-), std::placeholders::_1, &foo) );
    return 0;
}

使用lambdas的方式不那么可怕

std::for_each(v.begin(), v.end(), [](int a) -> int { return a - foo(a); });

答案 1 :(得分:0)

如果您不想修改矢量,我会假设您想将其转换为另一个矢量。

#include <algorithm>
#include <iterator>
#include <vector>

int foo(int a)
{
    return a;
}

int foo2(int a)
{
    return a - foo(a);
}

int main()
{
    std::vector<int> v;

    v.push_back(10);
    v.push_back(20);
    v.push_back(30);

    std::vector<int> v2;
    std::transform(v.begin(), v.end(), std::back_inserter(v2), foo2);

    return 0;
}