Передающий оператор как параметр

Я хочу иметь функцию, которая оценивает 2 bool vars (например, таблицу истинности)

например:

так как

T | F: T

то

myfunc('t', 'f', ||);  /*defined as: bool myfunc(char lv, char rv, ????)*/

должен возвращать true;

как я могу передать третий параметр? (Я знаю, что можно передать его как char *, но тогда мне придется иметь другую таблицу для сравнения строки оператора, а затем выполнить операцию, которую я бы хотел избежать)

Можно ли передать оператор как ^ (XOR) или || (OR) или && (AND) и т.д. в функцию/метод?

Заранее спасибо

Ответ 1

Определение:

bool myfunc(char lv, char rv, boost::function<bool(bool,bool)> func);

если у вас есть boost, или

bool myfunc(char lv, char rv, std::function<bool(bool,bool)> func);

если у вас есть компилятор С++ 0x или

template<class Func> bool myfunc(char lv, char rv, Func func);

Если вы хотите, чтобы это был шаблон. Затем вы можете позвонить:

myfunc('t', 'f', std::logical_or<bool>());

Ответ 2

@ybungalobill опубликовал правильный ответ на С++, и вы должны придерживаться его. Если вы хотите передать операторы, функции не будут работать, но макросы будут выполнять работу:

#define MYFUNC(lv, rv, op) ....

// Call it like this
MYFUNC('t', 'f', ||);

Будьте осторожны, макросы являются злыми.

Ответ 3

Что вы можете сделать, это определить операторы-посредники, которые возвращают определенные типы.

namespace detail {
    class or {
        bool operator()(bool a, bool b) {
            return a || b;
        }
    };
    class and {
        bool operator()(bool a, bool b) {
            return a && b;
        }
    };
    // etc
    class X {
        or operator||(X x) const { return or(); }
        and operator&&(X x) const { return and(); }
    };
};
const detail::X boolean;
template<typename T> bool myfunc(bool a, bool b, T t) {
     return t(a, b);
}
// and/or
bool myfunc(bool a, bool b, std::function<bool (bool, bool)> func) {
    return func(a, b);
}
// example
bool result = myfunc(a, b, boolean || boolean);

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

Кроме того, оператор XOR побитовый, а не логический, хотя разница практически ничего.

Однако есть причина, что lambdas существуют в С++ 0x, и это потому, что эта штука плоская всасывает в С++ 03.

Ответ 4

Это трудно реализовать. В С++ для параметра функции требуется адрес memroy, чтобы найти его объект, но оператор определяется во время компиляции. Оператор не будет объектом. Поэтому вы можете подумать о MACRO, чтобы завершить свою задачу.