Как обрабатывать составные операторы / побочные эффекты в шаблонах выражений

При реализации шаблонов выражений для типа вектор / массив я неизбежно дошел до того, что мне нужно предоставить operator +=,

Использование схемы шаблона выражения "по умолчанию" дает неинтуитивные результаты. Выражение a += b не возвращает результат вычисления, а скорее ссылку на левый операнд, который посредством побочного эффекта оператора увеличивается на величину b, Если operator+=() теперь возвращает шаблон выражения, а не сразу вычисляет результат, a += b; не будет иметь эффекта, который, вероятно, будет довольно удивительным при использовании этой схемы.

Есть ли какой-нибудь изощренный способ обработки составных операторов присваивания и / или побочных эффектов в контексте шаблонов выражений?

Я могу думать о трех возможностях прямо сейчас:

  1. Используйте шаблоны выражений по умолчанию и документируйте, что шаблон выражения должен быть оценен (какими бы ни были предоставлены средства).

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

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

Я склонен к использованию 3, потому что у двух других есть свои недостатки. Хотя те, что для 1, вероятно, довольно очевидны, 2 имеет проблему, заключающуюся в том, что при построении шаблона выражения необходимо обеспечить, чтобы фактическое вычисление побочного эффекта выражения не генерировалось, если деструктор noexcept должен быть сохранен. На практике это может быть проблематично.

0 ответов

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