В настоящее время я пишу матричный класс, который сможет поддерживать любое количество строк и столбцов с помощью шаблонов. Я застрял на том, как идти о предотвращении недопустимой операции (то есть количество столбцов для матрицы 1, количество строк для матрицы 2). Конечно, я мог бы хранить количество строк и столбцов и проверять их во время выполнения, но оптимально я хотел бы выполнить эту проверку во время компиляции с помощью аргумента шаблона «подстановочный знак».
Другими словами ...
Я хочу сделать это:
template <typename T, int R, int C>
struct mat {
T matrix[R][C];
void operator *=(const mat<T, C, [can be anything]> &other) {
/* do operation */
}
};
Вместо этого:
template <typename T, int R, int C>
struct mat {
T matrix[R][C];
int rows = R;
int columns = C;
void operator *=(const mat *other) {
if (columns != other->rows) {
/* error */
} else {
/* do operation */
}
}
};
Возможно ли это? Если да, то как мне это сделать?