Передача оператора в качестве параметра
Я хочу иметь функцию, которая оценивает 2 bool vars (например, таблицу истинности)
например:
С
T | F: T
затем
myfunc('t', 'f', ||); /*defined as: bool myfunc(char lv, char rv, ????)*/
должно возвращать true;
Как я могу передать третий параметр? (Я знаю, что можно передать его как символ*, но тогда мне придется иметь другую таблицу для сравнения строки оператора, а затем выполнить операцию, которую я хотел бы избежать)
это можно ли передать оператор типа ^(XOR) или ||(OR) или &&(AND) и т. д. В функцию/метод?
спасибо заранее
4 ответов
определение:
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);
если у вас есть компилятор C++0x или
template<class Func> bool myfunc(char lv, char rv, Func func);
если вы хотите, чтобы это был шаблон. Тогда вы можете позвонить:
myfunc('t', 'f', std::logical_or<bool>());
@ybungalobill опубликовал правильный ответ на C++, и вы должны придерживаться его. Если вы хотите передать операторы, функции не будут работать, но макросы будут выполнять работу:
#define MYFUNC(lv, rv, op) ....
// Call it like this
MYFUNC('t', 'f', ||);
будьте осторожны макросы-это зло.
вы можете определить прокси-операторы, возвращающие определенные типы.
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 является побитовым, а не логическим, хотя разница реально ничего.
однако есть причина, по которой лямбды существуют в C++0x, и это потому, что такая вещь плоская сосет в C++03.
Это трудно понять. В C++ параметру функции нужен адрес memroy для поиска объекта, но оператор определяется во время компиляции. Оператор не будет возражать. Таким образом, вы можете думать о MACRO, чтобы закончить свою задачу.