web-dev-qa-db-ja.com

パラメータとして演算子を渡す

2つのブール変数(真理値表のような)を評価する関数が欲しい

例えば:

以来

T | F:T

その後

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

trueを返す必要があります。

3番目のパラメーターを渡すにはどうすればよいですか? (char *として渡すことは可能ですが、演算子文字列を比較するために別のテーブルが必要になります。その後、回避したい操作を実行します)

関数/メソッドで^(XOR)、||(OR)、&&(AND)などの演算子を渡すことは可能ですか?

前もって感謝します

26
nacho4d

定義:

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>());
26
ybungalobill

@ybungalobillはC++の正解を投稿したので、それに固執する必要があります。演算子を渡したい場合、関数は機能しませんが、マクロは機能します。

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

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

注意してください、 マクロは悪です

5
Karel Petranek

できることは、特定の型を返すプロキシ演算子を定義することです。

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ではうまくいかないためです。

2
Puppy