2つのブール変数(真理値表のような)を評価する関数が欲しい
例えば:
以来
T | F:T
その後
myfunc('t', 'f', ||); /*defined as: bool myfunc(char lv, char rv, ????)*/
trueを返す必要があります。
3番目のパラメーターを渡すにはどうすればよいですか? (char *として渡すことは可能ですが、演算子文字列を比較するために別のテーブルが必要になります。その後、回避したい操作を実行します)
関数/メソッドで^(XOR)、||(OR)、&&(AND)などの演算子を渡すことは可能ですか?
前もって感謝します
定義:
bool myfunc(char lv, char rv, boost::function<bool(bool,bool)> func);
ブーストがある場合、または
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ではうまくいかないためです。