0Pricing
C++ Academy · Aula

Mixins com CRTP

Componha comportamentos em tempo de compilação

Mixins com CRTP é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

O que é um Componente Misto?

Um componente misto é uma pequena unidade reutilizável de comportamento que você compõe em uma classe. Com CRTP, os componentes mistos adicionam funcionalidade em tempo de compilação e ainda fazem chamadas para a classe hospedeira.

Um Componente Misto Simples

Este componente misto adiciona um método print_twice que depende de a classe hospedeira fornecer value().

#include <iostream>

template <typename T>
struct PrintTwice {
    void print_twice() const {
        auto v = static_cast<const T*>(this)->value();
        std::cout << v << " " << v << "\n";
    }
};

struct Box : PrintTwice<Box> {
    int value() const { return 7; }
};

int main() {
    Box{}.print_twice();
    return 0;
}

Compondo Vários Componentes Mistos

Você pode herdar de vários componentes mistos CRTP ao mesmo tempo, empilhando comportamentos independentes em uma única classe.

#include <iostream>

template <typename T>
struct Loggable {
    void log() const { std::cout << "log: " << static_cast<const T*>(this)->id() << "\n"; }
};

template <typename T>
struct Resettable {
    void reset() { static_cast<T*>(this)->set(0); }
};

struct Device : Loggable<Device>, Resettable<Device> {
    int v = 5;
    int id() const { return v; }
    void set(int x) { v = x; }
};

int main() {
    Device d;
    d.log();
    d.reset();
    d.log();
    return 0;
}

Componentes Mistos Também Adicionam Estado

Um componente misto pode conter seus próprios membros de dados, que se tornam parte do layout do objeto composto.

#include <iostream>

template <typename T>
struct Tagged {
    int tag = 0;
    void set_tag(int t) { tag = t; }
    int get_tag() const { return tag; }
};

struct Item : Tagged<Item> {
    const char* name = "item";
};

int main() {
    Item it;
    it.set_tag(42);
    std::cout << it.name << " " << it.get_tag() << "\n";
    return 0;
}

Componente Misto versus Herança Comum

Um componente misto CRTP difere da herança comum porque a base pode chamar para baixo, entrando na classe derivada. Classes base comuns não podem chamar métodos que existem somente no tipo derivado sem funções virtuais.

Projeto Baseado em Políticas

Os componentes mistos permitem um projeto baseado em políticas: os comportamentos são selecionados em tempo de compilação escolhendo de quais componentes mistos herdar, de forma semelhante à política de alocação aceita por std::vector.

Ordenação e Layout

Ao empilhar componentes mistos, a ordem das bases afeta a ordem de construção e o layout do objeto. Mantenha os componentes mistos independentes para que a ordem não afete a correção.

  • Construa na ordem de declaração das bases
  • Evite componentes mistos que dependam uns dos outros

Adicionando um Componente Misto de Igualdade

Aqui, um componente misto sintetiza operator!= a partir da igualdade da classe hospedeira.

#include <iostream>

template <typename T>
struct EqualityMixin {
    friend bool operator!=(const T& a, const T& b) { return !(a == b); }
};

struct P : EqualityMixin<P> {
    int x;
    P(int v) : x(v) {}
    friend bool operator==(const P& a, const P& b) { return a.x == b.x; }
};

int main() {
    std::cout << (P(1) != P(2)) << "\n";
    return 0;
}

Componentes Mistos Condicionais

Você pode incluir um componente misto somente quando uma condição for satisfeita, combinando herança com std::conditional para escolher entre um componente misto real e um vazio.

Otimização da Base Vazia

Os componentes mistos que não contêm membros de dados se beneficiam da Otimização da Base Vazia: o compilador aloca zero bytes adicionais para eles, portanto empilhar muitos componentes mistos sem estado não tem custo em termos de tamanho.

#include <iostream>

template <typename T>
struct A {};
template <typename T>
struct B {};

struct C : A<C>, B<C> {
    int x;
};

int main() {
    std::cout << (sizeof(C) == sizeof(int)) << "\n";
    return 0;
}

Quando Usar Componentes Mistos

Os componentes mistos são ideais quando muitas classes precisam dos mesmos comportamentos ortogonais (registro, contagem, comparação). Eles mantêm cada comportamento em um único lugar e permitem a composição sem custo em tempo de execução.

Verificação Rápida

Teste sua compreensão dos componentes mistos CRTP.

Recapitulação

Você aprendeu a criar componentes mistos com CRTP.

  • Os componentes mistos compõem comportamentos ortogonais em tempo de compilação
  • Eles podem chamar a classe hospedeira e armazenar estado
  • Os componentes mistos sem estado não têm custo graças à Otimização da Base Vazia
  • São excelentes para políticas de registro, comparação e contagem

Perguntas Frequentes

A aula “Mixins com CRTP” é grátis?

Sim — o texto completo de “Mixins com CRTP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Mixins com CRTP”?

Componha comportamentos em tempo de compilação Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Mixins com CRTP”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O padrão CRTP
  2. Polimorfismo estático
  3. Mixins com CRTP
  4. Quando usar CRTP
← Voltar para C++ Academy