Шаблонный атрибут класса
Условно зададим класс cell, описывающий треугольную ячейку.
class cell
{
public:
cell() = default;
cell(size_t number, std::array<size_t, 3> faces, std::array<size_t, 3> neighbours);
private:
size_t _number;
std::array<size_t, 3> _faces;
std::array<size_t, 3> _neighbours;
};
Как можно задать атрибут класса таким способом, чтобы класс подходил для ячеек любой формы? По ощущениям это должно выглядеть так:
template<typename SIZE>
class cell
{
public:
cell() = default;
cell(size_t number, std::array<size_t, SIZE> faces, std::array<size_t, SIZE> neighbours);
private:
size_t _number;
std::array<size_t, SIZE> _faces;
std::array<size_t, SIZE> _neighbours;
};
Но как оно должно выглядеть на самом деле?
Ответы (1 шт):
Почти так. Получается, вы хотите создать описание класса на базе которого должны формироваться уже конкретные классы, например: cell<3> или cell<5>. Т.е. раз весь ваш тип логически зависит от числа вершин, то шаблон класса тут идеально подходит.
Но! Параметром шаблона у вас должен быть не тип, а число (обратите внимание на первую строку):
template<size_t SIZE>
class cell
{
public:
cell() = default;
cell(size_t number, std::array<size_t, SIZE> faces, std::array<size_t, SIZE> neighbours);
private:
size_t _number;
std::array<size_t, SIZE> _faces;
std::array<size_t, SIZE> _neighbours;
};
Иначе ваш пример не скомпилируется, т.к. вы передаёте шаблонному классу cell какой-то тип как параметр и на базе этого типа конструируете std::array. Например, при SIZE = float тип вашего массива будет array<size_t, float> — что не имеет смысла.