Я пытаюсь преобразовать математическую библиотеку, написанную на VS, чтобы она компилировалась через GCC. Проблема в том, что у меня много перегруженных операторов, которые выглядят так:
template<code><typename T>
встроенный кватернион <T>
оператор + (кватернион <T>
& a, кватернион <T>
& b)
{вернуть кватернион <T>
(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);}
и т. Д.
Проблема в том, что эти операторы были спроектированы в предположении, что другие компиляторы будут поддерживать автоматические промежуточные звенья, созданные для выражений, подобных следующему:
...<br/>
quaternion<code><T>
q = log (exp (q0) * t);
...
Без них вышеперечисленное должно было бы превратиться в:
...<br/>
quaternion<code><T>
tmp = exp (q0);
tmp * = t;
кватернион <T>
q = log (tmp);
...
И это всего лишь простой пример. Некоторые выражения в системах, использующих эту библиотеку, расширились бы до нескольких сотен строк - что довольно неприятно, учитывая, что накладные расходы, связанные с отладкой числового кода в стиле ассемблера, скажем, для одной функции, которая растягивается на 600 строк, астрономичны минимум.
Мне кажется неоправданным, что весь механизм перегрузки операторов был введен в язык только для того, чтобы обеспечить другое соглашение об именах для обычных функций, не предлагая при этом реального синтаксического преимущества, когда речь идет о математических выражениях.
Но, конечно, я надеюсь, что ошибаюсь, предполагая это.
Что заставляет меня спросить: есть ли у GCC возможность создавать автоматические промежуточные звенья? Если нет, то какие компиляторы, кроме брендов MS, способны на это?
Или я совсем ошибся в этом и есть лучшая техника для создания того же эффекта?