Médio C++

Array de tamanho fixo com parâmetro não-tipo

Enunciado

Crie uma classe template ArrayFixo que recebe um tipo T e um inteiro N como parâmetros não-tipo. A classe deve ter um construtor que preenche todos os elementos com um valor padrão, um método tamanho() que retorna N, e um operador [] para acesso aos elementos. Use CTAD para criar uma instância sem especificar os parâmetros.

Requisitos

  • A classe deve ter dois parâmetros de template: typename T e int N.
  • O construtor deve inicializar todos os elementos com o valor fornecido.
  • O método tamanho() deve retornar N.
  • O operador [] deve permitir leitura e escrita.
  • O main deve usar CTAD para criar um ArrayFixo a partir de um valor e um tamanho.

Código inicial

#include <iostream>
#include <string>

template <typename T, int N>
class ArrayFixo {
    // TODO
};

int main() {
    // Use CTAD para criar ArrayFixo<int, 5> com valor inicial 7
    // Imprima o tamanho e os elementos
    return 0;
}

Saída esperada

Tamanho: 5
7 7 7 7 7
Ver dica

Declare o array como T dados[N];. No construtor, use um loop para preencher. O operador [] retorna referência.

Mostrar solução
#include <iostream>

template <typename T, int N>
class ArrayFixo {
    T dados[N];
public:
    ArrayFixo(const T& valor) {
        for (int i = 0; i < N; ++i) dados[i] = valor;
    }

    int tamanho() const { return N; }

    T& operator[](int i) { return dados[i]; }
    const T& operator[](int i) const { return dados[i]; }
};

int main() {
    ArrayFixo<int, 5> arr(7);
    std::cout << "Tamanho: " << arr.tamanho() << '\n';
    for (int i = 0; i < arr.tamanho(); ++i)
        std::cout << arr[i] << ' ';
    std::cout << '\n';
    return 0;
}

Passo a passo

  1. Declaramos ArrayFixo com dois parâmetros: typename T e int N.
  2. O membro dados é um array de T com tamanho N.
  3. O construtor recebe um valor e preenche todos os elementos.
  4. tamanho() retorna N.
  5. O operador [] permite acesso indexado, com versão const e não-const.
  6. No main, criamos ArrayFixo<int, 5> e usamos os métodos.

Por que funciona

O parâmetro não-tipo N é conhecido em tempo de compilação, permitindo alocar o array como membro. O template gera uma classe específica para int e 5. O operador [] retorna referência, permitindo modificar os elementos.

Erros comuns

  • Usar N como variável de runtime: não compila, pois N deve ser constante.
  • Esquecer a versão const do operador []: não é erro, mas impede acesso a objetos const.
  • Não inicializar o array no construtor: valores indefinidos.

Outra forma de resolver

Usar std::array<T, N>, que já oferece tudo isso. Preferível por ser padrão e seguro.

Saída esperada

Tamanho: 5
7 7 7 7 7