Eu tenho um código como
template <size_t N>
class A
{
template <size_t N>
someFunctions() {};
};
Agora eu quero criar instâncias da classe e chamar as funções nela em um loop for para um conjunto de muitos valores como
// in main()
int main()
{
for (int i = 1; i <= 100; i++)
{
const int N = i; // dont know how to do this
A<N> a;
a.functionCalls();
}
}
Como fazer isso? Esperando um método para fazer isso.
c++
for-loop
templates
compile-time-constant
template-classes
nachiappan venkatesh
fonte
fonte
N
precisa serconstexpr
o que se é uma variável loop que não é o casoRespostas:
Isso exigiria algo chamado a,
template for
que é o esperado pelas instruções de expansão de forma , algo que parece um loop for, mas na realidade é um bloco de modelo em uma função que é instanciada várias vezes.Obviamente, há uma solução alternativa. Podemos abusar de lambdas genéricas para declarar algum tipo de bloco de modelo local e instanciar ele mesmo:
Essa função pega uma sequência inteira e instancia o lambda
F
quantas vezes o comprimento da sequência.É usado assim:
Aqui,
N
pode ser enviado como parâmetro de modelo porque é um objeto que possui um operador de conversão constexpr para um tipo inteiro. Mais precisamente, é umstd::integral_constant
valor cada vez maior.Exemplo ao vivo
fonte
static_cast<void>
?f
retorna um tipo que sobrecarrega o operador vírgulatemplate for
. Abusando construções de linguagem como este é sempre mais dolorosaA
N
necessidade de ser constante em tempo de compilação, que é com umfor
loop normal, não é possível.Mas, existem muitas soluções alternativas. Por exemplo, inspirado nesta postagem do SO , você pode fazer algo como o seguinte. ( Veja uma demonstração ao vivo )
Imprime
1
em100
No c ++ 17 , o acima pode ser reduzido a uma única
AGenerator
classe de modelo (ou seja, a especialização pode ser evitada), usandoif constexpr
. ( Veja uma demonstração ao vivo )Saída :
No caso de fornecer o intervalo de iteração, você pode usar o seguinte. ( Veja uma demonstração ao vivo )
Produz o mesmo que a versão acima.
fonte
No C ++ 20, você pode usar lambdas de modelo, para tentar algo da seguinte maneira
A seguir, é apresentado um exemplo completo de compilação que imprime todos os números de 0 a 99
fonte
Uma maneira de fazer isso é com a meta-programação de modelos com algo como isto:
fonte
Apenas para completar - é realmente necessário que a classe ou função seja modelada, se o único uso da função deve ser chamado de loop?
Se sim, e você não quer escrever à mão, dê uma olhada no boost.hana.
fonte