Modelos variádicos e pacotes de parâmetros
Use pacotes de parâmetros e expressões de dobra para escrever modelos variádicos
Modelos variádicos e pacotes de parâmetros é 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.
Número variável de argumentos de modelos
Modelos variádicos aceitam qualquer quantidade de argumentos de modelos. São usados para escrever funções como std::make_unique, std::tuple e registro no estilo printf.
Sintaxe do pacote de parâmetros
Use typename... Ts para declarar um pacote de parâmetros de tipo e Ts... para expandi-lo.
template <typename... Args>
void print_all(Args... args) {
// ...
}Expansão de pacote
Os ... após uma expressão expandem o pacote em uma lista separada por vírgulas.
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}Modelos variádicos recursivos (estilo antigo)
Antes do C++17, as funções variádicas geralmente eram escritas de forma recursiva — processe um argumento e depois faça a recursão com o restante.
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}Expressões de redução (C++17)
O C++17 adicionou expressões de redução — muito mais limpas do que a recursão. Aplique um operador a um pacote.
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10Operadores de redução
Quatro formas de redução:
(... op pack)— redução à esquerda sobre uma expansão unária(pack op ...)— redução à direita(init op ... op pack)— redução à esquerda com inicialização(pack op ... op init)— redução à direita com inicialização
Imprimindo todos os argumentos
Um padrão comum com redução por vírgula.
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14Contando argumentos
sizeof...(pack) retorna a quantidade de itens em um pacote durante a compilação.
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}Modelos variádicos de classe
Os modelos de classe também podem ter pacotes de parâmetros. Exemplo: std::tuple<Ts...>.
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};Encaminhamento perfeito com pacotes
Combine modelos variádicos com std::forward para encaminhar perfeitamente argumentos arbitrários a um construtor.
template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}Manipulação de pacotes de tipos
Com especialização de modelos ou expressões de redução, você pode implementar operações de listas em tempo de compilação: primeiro, último e decomposição cabeça/cauda.
Armadilhas
Problemas comuns:
- Esquecer de expandir o pacote (
argsem vez deargs...) - Ordem de avaliação nas expressões de redução (esquerda versus direita importa para operadores não associativos)
- Maior tempo de compilação com recursão profunda
Verificação rápida
Qual recurso do C++17 simplifica a soma de todos os elementos de um pacote de parâmetros?
Recapitulação
Os modelos variádicos lidam com uma quantidade variável de argumentos de modelos por meio de pacotes de parâmetros. As expressões de redução do C++17 substituem o código variádico recursivo por expressões concisas. Com o encaminhamento perfeito, elas permitem criar funções de fábrica e mecanismos de despacho genéricos.
Perguntas Frequentes
A aula “Modelos variádicos e pacotes de parâmetros” é grátis?
Sim — o texto completo de “Modelos variádicos e pacotes de parâmetros” é 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 “Modelos variádicos e pacotes de parâmetros”?
Use pacotes de parâmetros e expressões de dobra para escrever modelos variádicos 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 “Modelos variádicos e pacotes de parâmetros”?
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
- Modelos de funções e classes: revisão
- Especialização parcial e total de modelos
- Modelos variádicos e pacotes de parâmetros
- Funções constexpr e if constexpr