[et] first draft
This commit is contained in:
48
examples/et/1_first_draft.cpp
Normal file
48
examples/et/1_first_draft.cpp
Normal file
@ -0,0 +1,48 @@
|
||||
#include <cstdio>
|
||||
|
||||
struct Add {
|
||||
template<typename T>
|
||||
static auto eval(T lhs, T rhs) {
|
||||
return lhs + rhs;
|
||||
}
|
||||
};
|
||||
|
||||
struct Mul {
|
||||
template<typename T>
|
||||
static auto eval(T lhs, T rhs) {
|
||||
return lhs * rhs;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
class Value {
|
||||
T _value;
|
||||
|
||||
public:
|
||||
Value(T value): _value(value) {}
|
||||
|
||||
auto eval() const { return _value; }
|
||||
};
|
||||
|
||||
template<typename Op, typename LHS, typename RHS>
|
||||
struct BinExpr {
|
||||
LHS lhs;
|
||||
RHS rhs;
|
||||
|
||||
auto eval() const {
|
||||
return Op::eval(lhs.eval(), rhs.eval());
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
using SubExpr = BinExpr<Mul, Value<int>, Value<int>>;
|
||||
using MyExpr = BinExpr<Add, Value<int>, SubExpr>;
|
||||
|
||||
int volatile v0 = 3, v1 = 5, v2 = 7;
|
||||
int result;
|
||||
|
||||
MyExpr expr{{v0}, {{v1}, {v2}}};
|
||||
result = expr.eval();
|
||||
|
||||
std::printf("%d\n", result);
|
||||
}
|
Reference in New Issue
Block a user