Avaliação constante do argumento do modelo
1. Por que o compilador não pode avaliar 'i' em tempo de compilação?
A avaliação em tempo de compilação requer que o valor de 'i' seja conhecido antes da execução do programa. No entanto, no código fornecido, 'i' é uma variável de loop que muda durante a execução do programa. O compilador não pode determinar o valor de 'i' em tempo de compilação porque é um valor atribuído dinamicamente.
2. Posso atingir o objetivo sem modificar a interface da API?
Sim, você pode usar a especialização de modelo para criar uma função recursiva que itera através do intervalo de argumentos do modelo. Por exemplo, você pode criar uma função:
template
void modify_recursive() {
// Call modify with template argument 'i'
modify();
// Recursively call modify_recursive with the next template argument
if (i ();
}
}
Chamando 'modify' com um argumento não constante
Para chamar 'modify' com um valor que não é uma constante de tempo de compilação, você pode usar um técnica chamada metaprogramação de modelo. Uma abordagem é criar uma classe de modelo que receba um objeto de função como argumento e o invoque com o valor desejado:
template
struct InvokeWithParam {
InvokeWithParam(F f, int param) : f(f), param(param) {}
void operator()() { f(param); }
F f;
int param;
};
Você pode então passar uma instância de InvokeWithParam como o argumento do modelo para modificar:
int var = 5;
modify();
Isso invocará a função de modificação com o valor de var.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3