2010-07-22 2 views
1

У меня есть функция A, которая принимает функцию предиката в качестве аргумента.
У меня есть еще одна функция B и принимает char и возвращает int, и функция, которая принимает Cint и возвращает bool.Как связать одну функцию с другим

Мой вопрос заключается в том, как связать B и C, чтобы передать его функции A.

Что-то вроде:

A(bindfunc(B,C)) 

Я знаю boost::bind работает, но я ищу СТЛ решения.

Например,

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, которая явным образом выполняет связать операцию.

+1

Возможно, более конкретный пример поможет ... – Cogwheel

+0

Зачем нужна вики сообщества? (BTW, чтобы быть ясным, пожалуйста, покажите объявление функции A, B и C.) – kennytm

+0

int count (вектор a, pred func); // эти функции подсчитывают все элементы, которые удовлетворяют условию int lastdigit (int x); // эта функция выводит последнюю цифру (в десятичной нотации) числа x bool isodd (int x); // эта функция указывает, является ли число x нечетным Я хочу найти количество всех таких чисел в вектор, последняя цифра нечетная , так что я хочу что-то вроде графа (вектор а, связывания (lastdigit, ISODD)) пожалуйста, дайте мне знать, если я не ясно – mukul

ответ

3

Как простой обходной путь для отсутствия 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.

+0

Это замечательный ответ, мне любопытно узнать, что вы делаете. Я начал полагать, что это невозможно сделать с помощью stl, и я должен скоро перейти на ускорение. Кстати, я теперь думаю, почему stl не предоставляет функцию компоновки. я также искал boost :: compose и узнал его устаревший и задавался вопросом, почему так. – mukul

+0

@mukul: Стандартная библиотека не имеет этого, потому что, откровенно говоря, его дизайн отстой, когда дело доходит до функциональных вещей. «Более общий и выразительный характер« Boost.Bind »устраняет даже необходимость в компоновке функтора. – GManNickG

+0

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

1

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