связать не значение, а функцию (с получением значения этой функции) - PullRequest
2 голосов
/ 01 февраля 2012

Допустим, у меня есть следующая функция:

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. Можно ли сделать это, используя только стандартные, не бустовые или самописные функторы?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Ну, это немного ужасно, но в 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;
}

менее ужасный способ использования лямбд

std::for_each(v.begin(), v.end(), [](int a) -> int { return a - foo(a); });
0 голосов
/ 01 февраля 2012

Если вы не хотите изменять вектор, поэтому я предполагаю, что вы хотите преобразовать его в другой.

#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;
}
...