Статья Wikibooks о шаблонах выражений предоставляет более подробные сведения, особенно последнюю часть:
В приведенном выше примере не показано, как рекурсивные типы генерируются во время компиляции.Кроме того, expr совсем не похож на математическое выражение, но оно действительно одно.В следующем коде показано, как типы рекурсивно составляются с использованием повторяющихся реализаций следующего перегруженного оператора +.
template< class A, class B >
DExpression<DBinaryExpression<DExpression<A>, DExpression<B>, Add> >
operator + (DExpression<A> a, DExpression<B> b)
{
typedef DBinaryExpression <DExpression<A>, DExpression<B>, Add> ExprT;
return DExpression<ExprT>(ExprT(a,b));
}
Вышеуказанный перегруженный оператор + выполняет две функции - добавляет синтаксический сахар и включает рекурсивныйкомпозиция типов, ограниченная пределами компилятора.Поэтому его можно использовать для замены вызова для оценки следующим образом:
evaluate (a.begin(), a.end(), x + l + x);
/// It is (2*x + 50.00), which does look like a mathematical expression.