Библиотека для хранения «уравнения» с участием ссылок? - PullRequest
1 голос
/ 09 апреля 2019

Таким образом, я могу передать по ссылке и сохранить эту ссылку в структуре или классе, и если я внесу изменения в другом месте и снова проверю эту ссылку, где я ее сохранил, изменения будут там, потому что я просто обращаюсь к той же памяти.

Есть ли библиотека, которая позволит мне сделать что-то вроде этого:

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;

Я мог бы сделать его сам, но я бы не стал изобретать велосипед, если он существует.

1 Ответ

2 голосов
/ 09 апреля 2019

Вопрос об OP напоминает мне другой ответ, где я смоделировал AST для небольшого примера компилятора с классами, похожими на функторы: Проект Tiny Calculator .

В этом проекте узлы выражений 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

Демонстрация в реальном времени на coliru

...