"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 > Por que variáveis ​​não constantes não podem ser usadas como argumentos de modelo em C++?

Por que variáveis ​​não constantes não podem ser usadas como argumentos de modelo em C++?

Publicado em 2025-01-12
Navegar:739

Why Can\'t Non-Constant Variables Be Used as Template Arguments in C  ?

Por que uma variável não constante não pode ser passada como um argumento de modelo?

Em C , os argumentos de modelo devem ser expressões constantes. Isso significa que seus valores devem ser conhecidos em tempo de compilação. O compilador não pode avaliar uma variável não constante neste contexto.

Considere o código:

template 
void modify(){}

Para passar uma variável não constante como argumento do modelo, podemos escrever:

for(int i = 0; i ();
}

No entanto, isso aciona um erro porque o compilador não pode determinar o valor de i em tempo de compilação. O corpo do loop pode ser executado várias vezes, alterando o valor de i.

Atingindo o objetivo sem modificar a API

Em vez de passar uma variável não constante diretamente, podemos usar a especialização de modelo para implementar uma chamada iterativa:

#include 

template
void modify() { std::cout " 
void modify() { std::cout " 
void modify() {
    std::cout " ();
}

int main() {
    modify();
}

Chamando Modify com um valor dinâmico

Para chamar Modify com um valor que não é conhecido em tempo de compilação, podemos usar uma técnica chamada metaprogramação de modelo. Aqui está um exemplo simplificado:

#include 

template <:tuple>>
struct TupleSize;

template 
struct TupleSize<:tuple>> {
    static const int value = sizeof...(Args);
};

template 
void callModify(int i) {
    if constexpr (i ();
        callModify(i 1);
    }
}

int main() {
    int n = 10;
    callModify::value>(0);
}

Neste exemplo, callModify usa um parâmetro N que é o tamanho de uma tupla que contém o intervalo de valores desejado para i. A função usa um metaprograma recursivo para gerar as chamadas para modificar até o tamanho especificado N.

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