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

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

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

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

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

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

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

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

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

Выражение X, Y

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

X=A+B+C

Y=X+C

D:=X+Y

Оператор where: = вычислить выражение не позднее времени.


person PT.    schedule 03.11.2009    source источник
comment
Я не уверен, о чем вы спрашиваете. Вы описываете проблему, заявляете, что ее можно решить на C ++ 0x, используя auto, а затем спрашиваете, можно ли ее решить на C ++ 0x?   -  person jalf    schedule 03.11.2009


Ответы (2)


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

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.
person Kaz Dragon    schedule 04.11.2009
comment
Ах, круто. Я искал это в Boost, но не нашел ... Спасибо. - person PT.; 04.11.2009

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

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

person Motti    schedule 03.11.2009