30

2つの変数を評価する関数bool(真理値表など)が必要です。

例えば:

以来

T | F : T

それから

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

する必要がありreturn true;ます。

3番目のパラメーターを渡すにはどうすればよいですか?

(char *として渡すことは可能ですが、演算子文字列を比較するために別のテーブルを用意してから、回避したい操作を実行する必要があります)

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

4

5 に答える 5

29

宣言する:

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

または、個別にリンクする必要がある場合:

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

次に、電話をかけることができます:

myfunc('t', 'f', std::logical_or<bool>());
于 2010-12-25T15:12:57.667 に答える
5

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

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

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

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

于 2010-12-25T15:18:25.000 に答える
2

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

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ではこの種の問題が発生するためです。

于 2010-12-25T15:20:54.697 に答える
1

最新のC++では、ラムダを使用して任意の演算子を渡すことができます。
更新1:提案されたソリューションは@HolyBlackCatによって提案された小さな改善を導入します

#include <iostream>

template<class T, class F> void reveal_or(T a, T b, F f)
{
    // using as function(a, b) instead of expression a || b is the same thing
    if ( f(a, b) ) 
        std::cout << a << " is || " << b << std::endl;
    else
        std::cout << a << " is not || " << b << std::endl;

}

template<class T> void reveal_or(T a, T b)
{
    // reuse the already defined ||
    reveal_or(a, b, [](T t1, T t2) {return t1 || t2; });
}

||の場合、パラメータの受け渡し方法を気にしないでください。演算子が定義されています

int main ()
{
    reveal_or('1', 'a');
    return 0;
}

パラメータとして明示的に渡す。エキゾチックなナンセンスを含め、何でも渡すことができます

int main ()
{
    //same as above:
    reveal_or('1', 'a', [](char t1, char t2) { return t1 || t2; });
    //opposite of above
    reveal_or('1', 'a', [](char t1, char t2) { return !( t1 || t2; ) });

    return 0;
}
于 2021-05-28T11:42:56.563 に答える
-2

実現するのは難しいです。C ++では、関数パラメーターはそのオブジェクトを見つけるためにmemroyアドレスを必要としますが、演算子はコンパイル時に決定されます。演算子はオブジェクトにはなりません。したがって、MACROについて考えてタスクを完了することができます。

于 2010-12-25T15:18:58.983 に答える