En supposant 10
est une compilation constante de temps...
#include <cstddef>
#include <utility>
template<std::size_t N>
struct do_N_times_type {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
closure();
do_N_times_type<N-1>()(std::forward<Lambda>(closure));
}
};
template<>
struct do_N_times_type<1> {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
std::forward<Lambda>(closure)();
}
};
template<>
struct do_N_times_type<0> {
template<typename Lambda>
void operator()( Lambda&& closure ) const {
}
};
template<std::size_t N, typename Lambda>
void do_N_times( Lambda&& closure ) {
do_N_times_type<N>()( std::forward<Lambda>(closure) );
};
#include <iostream>
void f() {
std::cout << "did it!\n";
}
int main() {
do_N_times<10>([&]{
f();
});
}
ou tout simplement
int main() {
do_N_times<10>(f);
}
D'autres ridicule méthodes:
Écrire une série d'itérateur (j'ai appeler le mien index
) qui produit une gamme de itérateur sur les types intégraux (j'ai par défaut std::size_t
). Puis tapez:
for( auto _:index_range(10) )
qui utilise une variable (_
), mais semble extrêmement déroutant.
Un autre fou approche serait de créer un python-comme générateur. L'écriture d'un générateur de wrapper qui prend un objet iterable gamme et produit une fonction qui retourne l' std::optional
sur le value_type
de la gamme n'est pas difficile.
Nous pouvons alors faire:
auto _ = make_generator( index_range(10) );
while(_()) {
}
ce qui crée une variable temporaire, et est même le plus obtus.
Nous pourrions écrire une boucle de la fonction qui opère sur les générateurs:
template<typename Generator, typename Lambda>
void While( Generator&& g, Lambda&& l ) {
while(true) {
auto opt = g();
if (!opt) return;
l(*opt);
}
}
nous appelons alors comme:
While( make_generator( index_range(10) ), [&](auto&&){
f();
});
mais cette fois, crée des variables temporaires dans la fonction, et est encore plus ridicule que le précédent, et s'appuie sur les fonctionnalités de C++1y qui n'a pas encore été finalisé.
Ceux où mes tentatives pour créer une variable, à moins de répéter quelque chose 10 fois.
Mais vraiment, je venais de faire la boucle.
Vous pouvez presque certainement bloquer l'avertissement en tapant x=x;
Ou écrire une fonction
template<typename Unused>
void unused( Unused&& ) {}
et appelez - unused(x);
-- la variable x
est utilisé, et son nom est tombée à l'intérieur, de sorte que le compilateur ne peut pas vous avertir à ce sujet à l'intérieur.
Donc, essayez ceci:
template<typename Unused>
void unused( Unused&& ) {}
for(int x{};x<10;++x) {
unused(x);
f();
}
ce qui devrait supprimer l'avertissement, et être facile à comprendre.