2010-04-14 3 views
7

Пусть следующие две функции:C++: соединение связей?

#include <iostream> 
#include <cstdlib> // atoi 
#include <cstring> // strcmp 
#include <boost/bind.hpp> 

bool match1(const char* a, const char* b) { 
    return (strcmp(a, b) == 0); 
} 

bool match2(int a, const char* b) { 
    return (atoi(b) == a); 
} 

Каждая из этих функций принимает два аргумента, но может быть преобразован в вызываемый объект, который принимает только один аргумент, с помощью (Std/импульс) bind. Что-то вдоль линий:

boost::bind(match1, "a test"); 
boost::bind(match2, 42); 

Я хочу, чтобы иметь возможность получить из двух функций, как эти, которые принимают один аргумент и возвращают bool, вызываемый объект, который принимает два аргумента и возвращает & & из bool s. Тип аргументов произвольный.

Что-то вроде operator&& для функций, которые возвращают bool.

+0

Вам не нужна функция, которая принимает один аргумент и возвращает bool? То есть эквивалентно 'match1 (« тест », X) && match2 (42, X)'? или вы действительно хотите 'match1 (« тест », X) && match2 (42, Y)'? –

+0

Я действительно хочу функцию, которая принимает два аргумента. –

ответ

9

Обратный тип boost::bind перегрузки operator && (а также many others). Таким образом, вы можете написать

boost::bind(match1, "a test", _1) && boost::bind(match2, 42, _2); 

Если вы хотите сохранить это значение, используйте boost::function. В этом случае тип будет

boost::function<bool(const char *, const char *)> 

Обратите внимание, что это не тип возвращаемого boost::bind (т.е. не определено), но любой функтор с правом подписи конвертируется в boost::function.

+0

@sth, отредактировано, хорошее предложение –

+0

Могу ли я получить функцию, которая возвращает что-то типа 'boost: bind'? –

+1

@Helltone, хороший вопрос - см. Мое редактирование –

Смежные вопросы