как связать одну функцию с другой - PullRequest
1 голос
/ 22 июля 2010

У меня есть функция 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))

Один плохой способ - создать избыточную функцию D, которая явно выполняет операцию связывания.

Ответы [ 2 ]

3 голосов
/ 22 июля 2010

В качестве простого решения проблемы отсутствия функции compose высшего порядка в 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); }

Обратите внимание, что он не работает для двоичных функций (требуется больше работы), и что ваши функции должны быть объектами функций STL. Это означает, что если у вас есть функциональные указатели, вы должны заключить их в std::ptr_fun.

1 голос
/ 22 июля 2010

Я не верю, что функции связывания STL достаточно универсальны для ваших нужд.

...