Промежуточные результаты с использованием шаблонов выражений
В 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
для автоматического вывода типа.
Я лично рассматриваю это как недостаток для шаблонов выражений, поскольку они часто используют меньшую продолжительность жизни, чем объекты, на которых они построены, что может оказаться ложным, если шаблон выражения захвачен, как я объясняю здесь.