Как использовать ref во время компиляции?

struct Matrix(int row, int col){ /* ... */ }

// finds the inverse using Gauss–Jordan elimination
pure M inverse(M)(const ref M m){ /* ... */ }

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

Но это становится проблемой в ситуациях, когда инверсия требуется во время компиляции:

mixin template A(){

  alias Matrix!(3, 3) Matrix3x3;

  static Matrix3x3 computeSomeMatrix(){ }

  immutable Matrix3x3 _m = computeSomeMatrix();
  immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix());  // error
}

Чтобы исправить ошибку, мне нужно изменить m на non-ref, но это означает, что матрицы будут копироваться каждый раз при вызове inverse () . Что мне делать?

5
задан Arlen 31 January 2012 в 16:43
поделиться