gpt4 book ai didi

c++ - 用于存储涉及引用的 "equation"的库?

转载 作者:行者123 更新时间:2023-11-30 03:17:21 25 4
gpt4 key购买 nike

所以我可以通过引用传递,并将该引用存储在结构或类中,如果我在其他地方进行更改并再次检查我存储它的引用,更改将在那里,因为我只是访问相同的内存。

是否有一个库可以让我做这样的事情:

int foo = 9;
int bar = 5;
// obviously other arithmetic would exist too, and could be combined
Equation foo_minus_bar = Subtract(foo, bar);

// output: 4
cout << foo_minus_bar << endl;

foo = 11;

// output: 6
cout << foo_minus_bar << endl;

如果我可以访问输入也很好(最好是平面数组或类似的,但乞丐不能选择,甚至可能是这样的:

// literal character for character output: foo - bar
cout << foo_minus_bar.formula() << endl;

我可以自己造一个,但如果有轮子,我宁愿不重新发明。

最佳答案

OP 的问题让我想起了另一个答案,我在其中模拟了一个 AST对于一个带有仿函数类的小示例编译器:The Tiny Calculator Project .

在该项目中,AST 表达式节点拥有其子(表达式)节点的所有权。

我不确定我是否正确阅读了 OP 的意图,但当然,它也可以设计为不具有子(表达式)节点所有权的表达式节点。

因此,我做了另一个(更短的)例子。此外,我重载了 operator()()(而不是 virtual solve() 成员函数)。不过,在这种情况下,我认为这是一个品味问题。

示例代码:

#include <iostream>

struct Expr {
virtual int operator()() const = 0;
};

struct ExprConst: Expr {
const int value;
ExprConst(int value): value(value) { }
virtual int operator()() const { return value; }
};

struct ExprRef: Expr {
const int &ref;
ExprRef(const int &ref): ref(ref) { }
virtual int operator()() const { return ref; }
};

struct ExprBin: Expr {
const Expr &arg1, &arg2;
ExprBin(const Expr &arg1, const Expr &arg2):
arg1(arg1), arg2(arg2)
{ }
};

struct ExprSub: ExprBin {
ExprSub(const Expr &arg1, const Expr &arg2):
ExprBin(arg1, arg2)
{ }
virtual int operator()() const { return arg1() - arg2(); }
};

int main()
{
int foo = 9;
int bar = 5;
ExprRef exprFoo(foo), exprBar(bar);
ExprSub exprSub(exprFoo, exprBar);
std::cout << "foo - bar: " << exprSub() << '\n';
std::cout << "foo = 7; bar = 10;\n";
foo = 7; bar = 10;
std::cout << "foo - bar: " << exprSub() << '\n';
// done
return 0;
}

输出:

foo - bar: 4
foo = 7; bar = 10;
foo - bar: -3

Live Demo on coliru

关于c++ - 用于存储涉及引用的 "equation"的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55584609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com