"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso obter avaliação constante com argumentos de modelo quando o argumento não é conhecido em tempo de compilação?

Como posso obter avaliação constante com argumentos de modelo quando o argumento não é conhecido em tempo de compilação?

Publicado em 2024-11-20
Navegar:192

How Can I Achieve Constant Evaluation with Template Arguments When the Argument Is Not Known at Compile Time?

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.

Tutorial mais recente Mais>

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