привязать не значение, а функцию (с получением значения этой функции)

Скажем, у меня есть следующая функция:

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


person fogbit    schedule 01.02.2012    source источник
comment
1) Где вы хотите сохранить результат вычитания? Изменить вектор или создать другой? 2) Функция foo реализована для возврата значения параметра, так какой смысл вычитать значение из самого себя (всегда возвращает ноль)?   -  person Sergey Vyacheslavovich Brunov    schedule 01.02.2012
comment
1) Допустим, я не хочу изменять исходный вектор 2) Что, если у меня есть другая функция?   -  person fogbit    schedule 01.02.2012


Ответы (2)


Ну, это немного ужасно, но в С++ 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); });
person Zharf    schedule 01.02.2012
comment
Если вы собираетесь использовать С++ 11, просто напишите лямбду. - person Cat Plus Plus; 01.02.2012
comment
Ну да, похоже, его больше интересовала часть привязки... Я отредактирую лямбда-пример - person Zharf; 01.02.2012
comment
Хм, вы действительно думаете, что первый вариант кода (без лямбда-выражений) ремонтопригоден? знак равно - person Sergey Vyacheslavovich Brunov; 01.02.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;
}
person Sergey Vyacheslavovich Brunov    schedule 01.02.2012