Это работает, если вы делаете Add
шаблон вместо жесткого кодирования, что его левый и правый аргументы должны быть литералами:
template<typename L, typename R>
class Add : public Expression<Add<L,R>>
{
protected:
L lhs;
R rhs;
public:
Add(L left, R right) : lhs(left), rhs(right) {}
int eval() { return lhs.eval() + rhs.eval(); }
};
Компиляция Add(Add(Literal(10),Literal(20)),Literal(30)).eval()
требует C ++ 17. Если вы хотите, чтобы он работал с C ++ 11, вам нужно написать функцию-оболочку, аналогичную std::make_pair
, чтобы избежать необходимости писать Add<Literal, Literal>
и т. Д.