C++ 如何存储逻辑关系

C++ 如何存储逻辑关系,c++,logical-operators,C++,Logical Operators,我想找出一个自动逻辑关系检查的解决方案。例如,我有一个函数IsGood(),它将从a、b、c……中获取布尔值。。。。在主程序中,有if(a | | b)或if(b&c)或if(g&!k&l | | z),不同的关系。我想用IsGood()替换所有函数,并且我想使这个函数更通用,它可以处理不同的逻辑关系 所以我的想法是放置一些ID,这将帮助这个函数知道现在需要处理哪些变量,例如,IsGood()得到了值k1,k2,k3,但是IsGood()不知道k1,k2,k3之间的逻辑关系 所以我想知道如

我想找出一个自动逻辑关系检查的解决方案。例如,我有一个函数
IsGood()
,它将从a、b、c……中获取布尔值。。。。在主程序中,有
if(a | | b)
if(b&c)
if(g&!k&l | | z)
,不同的关系。我想用
IsGood()
替换所有函数,并且我想使这个函数更通用,它可以处理不同的逻辑关系

所以我的想法是放置一些ID,这将帮助这个函数知道现在需要处理哪些变量,例如,
IsGood()
得到了值k1,k2,k3,但是
IsGood()
不知道k1,k2,k3之间的逻辑关系

所以我想知道如何让
IsGood()
自动获取值之间的关系。将它们存储在数据库中

比如:
IsGood()
首先检查它是否在place1中,因此它查询数据库,结果是:(这就是为什么我不在
IsGood()
中获取参数的原因,它将从数据库或配置文件中检索它需要的变量,它只需要placeID。)

地点1(地点编号);k1、k2、k3(变量名);真、真、假(值)&&、|(逻辑关系)

但我觉得这不好……那么,你能给我一些想法吗?谢谢!我的工作是基于C++的。 我想知道一些关于这方面的想法:

a | | | b&&c,我可以存储信息,比如0,1,所以0代表| |,1代表&&c,所以像a&&b | c…这样的结构很容易控制


但如何设置(a | | b)和c?我也想找到一种记录这种关系的方法。聪明的方法将受到赞赏!!谢谢。

我首先要定义一组在给定对象上工作的逻辑操作,例如:

// 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;
};
然后你可以按如下方式打电话

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

这不行。句号

在C++中,变量具有范围。名称<代码> K1 < /Cord>在不同的地方可能意味着不同的东西。因此,即使函数<代码>好> <代码>神奇地知道它应该访问一个名为“代码> K1 < /代码>的变量,它仍然无法找出哪一个<代码> k1 <代码>,从哪个范围可以。

<>这对于C++程序员来说不是什么大问题。他们的解决方案是:<代码> ISHOLD(K1)< /C> >,这意味着:调用<代码> ISOGON/<代码>,使用这个代码>当前的范围内的K1<代码>变量,而不是另一个。 现在,传递运算符有点困难。您需要lambda来实现:
IsGood([&k1,&k2,&k3]({return(k1&&k2)| k3;})
。它引用变量k1-3,并将表达式
(k1&&k2)| k3;
传递到
IsGood
,或以两行形式传递:

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

同样,这一切之所以有效,是因为你传递了它所需要的信息。
是好的。它无法以任何其他方式获得它。

也许可以尝试显示代码来说明问题,你想做什么,你迄今为止尝试了什么,以及为什么它不起作用。我是否正确,你希望做的是隐式替换
如果(a | | b)
如果(b和c)
如果(IsGood(a)| IsGood(b))
如果(IsGood(b)和&IsGood(c))
如果
a
b
c
是自定义类型,您可能会发现为每种类型实现
操作符bool()
更容易。不,我想我可以用
IsGood(placeID)来实现
,问题是我想制定一个通用方法来处理变量之间不同的逻辑关系。这是对我的项目的一个优化。那么你要找的是将布尔值和逻辑运算符的列表传递给一个函数,该函数将解析它们并计算结果?我觉得很难相信这一点这将是对使用短路运算符并让编译器处理其余操作的优化。您是否尝试过分析代码中的其他内容是否会降低速度?永远不要假设需要优化的内容!但您如何控制这一次
IsGood()的情况
得到了k1、k2、k3,但下一次得到k4、k6、k7、k8。应该知道它们之间的逻辑关系。@Alex,你如何“得到”k1,k2,k3和在不同的情况下得到k4,k5,k6,k7?我在配置中设置,所以不同的地方使用不同的variables@Alex,是的,但您必须编写一些代码来读入变量集,以及应用于这些变量的逻辑,读入后,构造上述运算符,然后将它们传递给
IsGood()
函数。我不清楚您目前是如何实现的,上面的内容解决了如何应用一组通用逻辑运算的问题,缺少的部分是您的读取工作方式……或者您的问题是您不知道如何解析某些输入以确定逻辑运算集?例如,创建一个解析程序来解析简单语法很简单例如下面的
(a&b)| | c
auto myLambda = [&k1,&k2,&k3](){return (k1&&k2)||k3;} ;
IsGood(myLambda);