оператор перегрузки только для конкретного случая класса

#c #matrix #operator-overloading

#c #матрица #оператор-перегрузка

Вопрос:

У меня есть, class matrix где я хочу перегрузить оператор, но только если обе матрицы имеют одинаковое количество строк и столбцов.

 class matrix
{
private:
    int rows, columns;
    double* data;
public:
    //things here: constructor, destructor etc.
    matrix operator  (const matrixamp;) const;
};
  

Тогда я хочу добавить две матрицы, только если они имеют одинаковое количество строк и столбцов.
То, что я сейчас делаю, это:

 matrix matrix::operator (const matrixamp; adder) const
{
if(rows == adder.rows() amp;amp; columns == adder.columns())
{
    matrix temporal;
    //Perform the addition
    return temporal;
}
else
    std::cout << "Unable to add matrices" << std::endl;
    //return an empty matrix of 0 rows, 0 columns.
}
  

Моя проблема в том, что я могу «добавить» любые две матрицы таким образом. Есть ли какой-либо способ, которым я могу перегрузить оператор только для случая, когда матрицы имеют одинаковый размер (и получаю ошибку при попытке скомпилировать добавление двух матриц, которые не могут быть добавлены)?

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

Комментарии:

1. Как компилятор узнает, сколько строк и столбцов содержит матрица во время выполнения?

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

3. Во время компиляции не определяется количество строк и столбцов (которые могли быть перехвачены с помощью std::enable_if ). Если вы хотите предотвратить эту ситуацию, вам следует создать исключение,, или, по крайней мере, утверждение, поскольку ваша реализация не поддерживает разные значения строк и столбцов.

4. Поскольку matrix во время компиляции нет понятия размера, невозможно применить ограничения, основанные на размере, во время компиляции. Вам нужно будет обработать это во время выполнения или кардинально изменить способ matrix реализации, чтобы включить информацию о размере во время компиляции.

Ответ №1:

Есть ли какой-либо способ, которым я могу перегрузить оператор только для случая, когда матрицы имеют одинаковый размер (и получаю ошибку при попытке скомпилировать добавление двух матриц, которые не могут быть добавлены)?

Ошибка времени компиляции не может быть сгенерирована для ошибки времени выполнения.

Вы можете сгенерировать ошибку во время компиляции, если вы хотите, чтобы размеры матрицы были известны во время компиляции. Этого можно достичь с помощью

 template <size_t NUM_ROWS, size_t NUM_COLUMNS>
class matrix
{
   ...
};
  

Вам нужно будет выяснить, будет ли это соответствовать вашим требованиям.