因此,我可以按引用传递,并将该引用存储在结构或类中,如果我在其他地方进行更改,然后再次检查该引用的存储位置,则更改将在那里,因为我只是在访问相同的内存。
有没有一个图书馆可以让我做这样的事情:
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;
如果我可以访问输入(最好是平面数组或类似的输入,但是乞g不能成为选择者,甚至可能是这样的话),那也很好:
// literal character for character output: foo - bar
cout << foo_minus_bar.formula() << endl;
我可以自己动手,但我不希望自己发明轮子。
答案 0 :(得分:2)
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