-1

自動論理関係チェックの解決策を見つけたい。たとえば、私は関数を持っていますIsGood()、それはa、b、cからbool値を取得します....メインプログラムにはif(a||b)、またはif(b&&c)、、if(g&&!k&&l||!z)異なる関係があります。それらすべてをに置き換えたいのIsGood()ですが、この関数をより一般的にしたいので、さまざまな論理関係を処理できます。

だから私の考えは、この関数が現在処理する必要のある変数を知るのに役立つIDを置くことです。たとえば、値k1、k2、k3を取得しましたが、k1、k2 、k3間IsGood()の論理関係は。||&&IsGood()

IsGood()だから私は値の間の関係を自動的に取得させる方法を知りたいです。それらをデータベースに保存しますか?

のように:IsGood()最初にそれがplace1にあることを確認し、データベースにクエリを実行すると、結果は:(これがパラメータを取得しない理由です。IsGood()データベースまたは構成ファイルから必要な変数を取得します。必要なのはplaceID。)

場所1(場所番号); k1、k2、k3(変数名); true、true、false(値); &&、|| (論理的関係)。

でもいいとは思いませんが…では、アイデアを教えていただけませんか?どうもありがとう!私の仕事はC++に基づいています。

私はこれについていくつかのアイデアを知りたいです:

a || b && c、0,1のような情報を格納できるので、0は||を表し、1は&&を表すので、a && b ||c...のような構造は簡単に制御できます。

しかし、(a || b)&& cを設定する方法は?この関係を記録する方法も見つけたいと思います。スマートな方法をいただければ幸いです!! ありがとう。

4

2 に答える 2

0

これは機能しません。限目。

C ++では、変数にスコープがあります。名前k1は場所によって意味が異なる場合があります。したがって、関数IsGoodが何らかの形でという名前の変数にアクセスする必要があることを魔法のように知っていたとしても、それがどのスコープからのものであるかを判断するk1方法はありません。 k1

これはC++プログラマーにとって大したことではありません。彼らの解決策:IsGood(k1)、つまり:現在のスコープからこの変数を呼び出しIsGood、別のスコープからは呼び出しません。 k1

さて、演算子を渡すのは少し難しいです。そのためにはラムダが必要です:IsGood( [&k1,&k2,&k3](){return (k1&&k2)||k3;} );。これは変数k1-3への参照を取り、式(k1&&k2)||k3;をに渡しIsGoodます。または2行で:

auto myLambda = [&k1,&k2,&k3](){return (k1&&k2)||k3;} ;
IsGood(myLambda);

繰り返しますが、必要な情報を渡すため、これはすべて機能IsGoodします。他の方法では取得できません。

于 2012-09-18T12:30:01.377 に答える
0

まず、特定のオブジェクトで機能する一連の論理演算を定義することから始めます。次に例を示します。

// This is just a simple wrapper for the first argument
template <typename T>
struct FirstOp
{
  FirstOp(T const& v) : _v(v)
  { }

  T const & operator*() const { return _v; }

  T const& _v;
};

template <typename T>
struct AndOp
{
  AndOp(T const& v) : _v(v)
  { }

  T const & operator*() const { return _v; }

  // Then hack the stream operator
  template <typename O>
  O const & operator>>(O const & o) const
  {
    if (o)
      o = o && _v; // assumes T supports safe bool

    return o;
  }

  T const& _v;
};

template <typename T>
struct OrOp
{
  OrOp(T const& v) : _v(v)
  { }

  T const& operator*() const { return _v; }

  // Then hack the stream operator
  template <typename O>
  O const & operator>>(O const & o) const
  {
    if (!o)
      o = o || _v; // assumes T supports safe bool

    return o;
  }

  T const& _v;
};

template <typename Op1>
struct ResultOf
{
  ResultOf(Op1 const& cOp) : _o1(cOp), _r(*_o1)
  { }

  ResultOf const & operator=(bool r) const
  { _r = r; return *this; }

  operator bool() const { return _r; }

  // Then hack the stream operator
  template <typename O>
  ResultOf& operator>>(O& o)
  {
    o >> *this;
    return *this;
  }

  Op1 const& _o1;
  mutable bool _r;
};

次に、IsGoodパラメータを受け入れるようにを定義し、より多くのパラメータをサポートするためにオーバーロードします。

template <typename T1, typename T2>
bool IsGood(T1 const& t1, T2 const& t2)
{
  return ResultOf<T1>(t1) >> t2;
}

その後、次のように呼び出すことができます。

int main(void)
{
  std::cout << IsGood(FirstOp<int>(0), OrOp<int>(1)) << std::endl;
}

したがって、このアプローチで可能になったのは、特定の論理演算に使用する値をその演算でラップしてから、それを総称IsGood関数に渡すことです。ここで、構築される実際の演算子はハードコーディングされていますが、たとえばファイルからこれを読み取り、に渡す適切な演算子を構築することを妨げるものは何もありませんIsGood。注:上記は短絡であるため、必要に応じて引数を評価するだけです(関数呼び出しが行われます)が、式は評価されません。上記のアプローチを使用して、任意に複雑な論理関係を作成できるはずです。

免責事項:これはあなたの問題についての私の限られた理解です...それがマークから外れている場合は、まあ...

于 2012-09-18T10:38:01.283 に答える