Промежуточные результаты с использованием шаблонов выражений

В C++. Метапрограммирование шаблонов: концепции, инструменты и методы Boost и Beyond

... Одним из недостатков шаблонов выражений является то, что они имеют тенденцию поощрять написание больших и сложных выражений, потому что оценка задерживается только до вызова оператора присваивания. Если программист хочет повторно использовать какой-то промежуточный результат, не оценив его заранее, он может быть вынужден объявить сложный тип, такой как:

Expression<
           Expression<Array,plus,Array>,
           plus,
           Expression<Array,minus,Array>
          > intermediate = a + b + (c - d);

(или хуже). Заметьте, как этот тип не только точно и избыточно отражает структуру вычислений, и поэтому его нужно будет поддерживать при изменении формулы, но также и поразить ее? Это давняя проблема для C++ DSEL. Обычный обходной путь - захват выражения с использованием стирания типа, но в этом случае платят за динамическую диспетчеризацию. В последнее время было много дискуссий, инициированных самим Бьярном Страуструпом, о повторном использовании рудиментарного ключевого слова auto для получения вывода типа в объявлениях переменных, так что вышеприведенное можно переписать так:

auto intermediate = a + b + (c - d);

Эта функция будет огромным преимуществом как для авторов C++ DSEL, так и для пользователей...

Возможно ли решить эту проблему с текущим C++ std. (не C++0X)

Например, я хочу написать выражение как:

Экспр X,Y

Матрица A,B,C,D

Х = А + В + С

Y=X+C,

D:=X+Y

Где оператор: = оценить выражение в самое позднее время.

2 ответа

Решение

На данный момент вы всегда можете использовать BOOST_AUTO() вместо ключевого слова auto в C++0x, чтобы легче получить промежуточные результаты.

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.

Я не понимаю ваш вопрос. auto будет использоваться повторно в C++0x для автоматического вывода типа.

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

Другие вопросы по тегам