2012-02-24 4 views
4

Некоторые операторы, такие как && и || выполняют оценку короткого замыкания. Кроме того, когда функция вызывается с аргументами, все аргументы строятся до вызова функции.Как реализовать оценку короткого замыкания в пользовательских функциях?

Например, возьмем следующие три функции

bool f1(); 
bool f2(); 
bool f3(bool, bool); 

, если я позвоню

if(f3(f2(),f1()))//Do something 

Тогда возвращаемое значение как f2 и f1 вычисляются до f3 называется. Но, если бы я использовал (регулярное) operator|| вместо f3, чем приведенный выше код будет эквивалентен

if(f2()||f1())//Do something 

и f1 не будет оцениваться, если f2 оценивается как истина.

Мой вопрос: Возможно ли, что f3 (определенная пользователем функция с двумя булевыми) ведет себя одинаково? Если нет, что делает operator|| особенным?

+0

Возможно, если вы включите его ... в противном случае, абсолютно нет. –

ответ

2

Не, если f3() принимает значения результата функций.

Но если он принимает адрес функций (или более общий обрабатывает его ввод как функторы), а не результаты, то f3() может решить, нужно ли ему вызвать функцию.

template<typename F1, typename F2> 
bool f3(F1 const& f1, F2 const& f2) 
{ 
    return f1() || f2(); 
} 

bool f1(); 
bool f2(); 

int main() 
{ 
    f3(&f1, &f2); 
} 
0

Ваша посылка неправильная. Перегруженные operator|| и operator&& всегда оценивают как их аргументы; нет короткого замыкания.

См. Пункт 7 из More Effective C++ для обсуждения этого вопроса.

+0

Я знаю, что они делают. Я не говорю о перегруженном 'operator ||' Я говорю о стандартном 'operator ||'. Я говорю: 'operator ||' принимает 2 аргумента, но использует короткое замыкание, возможно ли иметь такой же эффект на пользовательскую функцию из 2 аргументов? – Malabarba

+0

@BruceConnor: А, ок. В этом случае ответ: 'operator ||' и 'operator &&' на примитивах являются особыми, потому что стандарт говорит об этом. Я не думаю, что есть способ подражать этому с произвольными функциями. –

0

Вы не можете сравнить || оператора и подобных функций. || является логическим оператором и проверяет заданные значения, если левый операнд оценивается как false, тогда нет необходимости проверять правильность.

В случае функций любое значение, возвращающее возврат f1() или f2(), относится к f3(). Невозможно включить функцию «логический операнд» для параметров функции, даже если они принимают параметры bool.