1.Можно ли просто специализировать конструктор в шаблонном классе?
У меня есть такой пример:
// squared matrix class
template <unsigned int size>
class Matrix {
public:
// list of lists matrix constructor
Matrix(std::initializer_list<std::initializer_list<float>> values);
// actual static data
float data[size][size];
};
Так что в принципе я могу создать квадратные матрицы любого размера с помощью вложенного инициализаторасписки, как в:
Matrix <3> Identity {
{1.,0.,0.},
{0.,1.,0.},
{0.,0.,1.}
};
Теперь я хотел бы предоставить только для матриц 3x3 конструктор, который берет 3 трехмерных вектора (класс Vec3
в моем коде) и использует их какстолбцы матрицы для построения матрицы 3x3.
Можно ли просто специализировать конструктор?
Если я специализируюсь на всем классе, например:
template <>
class Matrix<3> {
public:
// build matrix providing 3 Vec3 (your basis) which will be the columns
Matrix(std::initializer_list<Vec3> basis_vectors);
};
Затем я получаю ошибки внутри определения ctor:
Matrix<3>::Matrix(std::initializer_list<Vec3> basis_vectors) {
// only accept 3 vectors
assert(basis_vectors.size() == 3);
// column counter
unsigned int j = 0;
for (auto & col : basis_vectors) {
// copy a column (col to data[:][j])
data[0][j] = col[0];
data[1][j] = col[1];
data[2][j] = col[2];
// increase j for column
j++;
}
}
, например, «идентификатор« данные »не определен».
Примечания : я бы хотел избежать наследованиякак я могу.Странные шаблонные шаблоны могут быть хорошими, но, возможно, их лучше избегать (в противном случае все становится еще менее читабельным, чем сейчас).Хотелось бы отметить, что мой фокус - производительность.Поэтому я ищу самое быстрое и, возможно, самое чистое решение (например, чистое для пользователя, которому приходится создавать экземпляры этих классов. Поэтому я использую списки инициализаторов в конструкторе).
Дополнительные вопросы:
2.Какой правильный синтаксис для специализации конструктора?
Я имею в виду: мне нужно предоставить template <blabla>
или template<>
или ничего перед именем метода?А как насчет метода конструктора?Это Matrix()
или Matrix<3>()
?
3.Есть ли способ, позволяющий моему конструктору использовать синтаксис списка фигурных скобок при создании экземпляра объекта (чтобы иметь более чистый и равномерный синтаксис) при одновременном применении фиксированного размера списка?
В моемВ этом случае я хотел бы иметь конструктор, который просто принимает 3 Vec3
(и знает, что во время компиляции, без assert
ing).Но я бы предпочел избежать подписи Matrix(Vec3 a, Vec3 b, Vec3 c)
.Возможно ли это?
4.Какой более чистый и удобный для меня способ сделать то, что я пытаюсь сделать, то есть установить столбцы в двумерном массиве?
Если для этого требуется полностью изменить мои структуры данных, используя некоторые аккуратныеC ++ 11/17/20 / что бы то ни было std::something
, используя что-то, что уже реализует нарезку nD-массивов, или реализуя это сам, я здесь готов сделать все это.
Мне просто нужно немногохороший совет по всем этим вопросам.Так легко начать писать что-то, а потом потеряться во всех этих деталях и в итоге ничего не написать, чувствуя, что существует слишком много направлений, куда можно пойти, и это может привести к неоптимальному, нечитаемому,код болезненного рефакторинга: (