Я строю Матрицу статического типа, где все операции с матрицами проверяются по типу. Однако у меня возникают проблемы, когда я хочу сделать что-то, что изменяет Матрицу на основе заданного числа.
Например, добавить один столбец тривиально:
template<int A, int B>
Matrix<A,B+1> addOneCol(Matrix<A,B> m1) {
return Matrix<A,B+1>();
}
Однако добавление N столбцов это намного сложнее. Поскольку невозможно проверить тип с помощью функции, у которой есть ветвь, в которой тип возвращаемого значения не является ожидаемым (даже если условие ветвления гарантирует это), я могу думать только о рекурсивном подходе:
template<int A, int B, int Z>
Matrix<A,B+1> addZCols(Matrix<A,B> m1) {
return addOneCol(m1);
}
template<int A, int B, int Z>
Matrix<A,B+Z> addZCols(Matrix<A,B> m1) {
return addOneCol(addZCols<A,B,Z-1>(m1));
}
template<int A, int B>
Matrix<A,B+1> addOneCol(Matrix<A,B> m1) {
return Matrix<A,B+1>();
}
Однако это перегружает addZCols
в типе возврата, что недопустимо и приводит к ошибке, говорящей о том, что вызов addZCalls
является неоднозначным и не может выбрать одного из 2 кандидатов. И я хочу, чтобы версия с B+1
называлась, так сказать, только базовым случаем, когда Z=1
.
Любая идея о том, как заставить это работать, или другой подход?