Шаблонный атрибут класса

Условно зададим класс 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 шт):

Автор решения: tak333

Почти так. Получается, вы хотите создать описание класса на базе которого должны формироваться уже конкретные классы, например: 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> — что не имеет смысла.

→ Ссылка