J'aime la solution foncteur:
template <int limit> class NegativeNumber
{
public:
NegativeNumber() : current(0) {};
int operator()()
{
return -(1 + (current++ % limit));
};
private:
int current;
};
Ensuite, vous pouvez définir tout générateur avec une limite et de l'utiliser:
NegativeNumber<5> five;
NegativeNumber<2> two;
for (int x = 0; x < 20; ++x)
std::cout << "limit five: " << five() << "\tlimit two: " << two() << '\n';
Vous pouvez également passer le générateur en tant que paramètre à une autre fonction, chaque funtor avec son propre état:
void f5(NegativeNumber<5> &n)
{
std::cout << "limit five: " << n() << '\n';
}
void f2(NegativeNumber<2> &n)
{
std::cout << "limit two: " << n() << '\n';
}
f5(five);
f2(two);
Si vous ne souhaitez pas la solution de modèle pour déclarer la limite, il y a aussi la version non-modèle:
class NegativeNumberNoTemplate
{
public:
NegativeNumberNoTemplate(int limit) : m_limit(limit), current(0) {};
int operator()()
{
return -(1 + (current++ % m_limit));
};
private:
const int m_limit;
int current;
};
En utilisant comme argument à une fonction fonctionne de la même manière, et il est l'état interne est transféré ainsi:
void f(NegativeNumberNoTemplate &n)
{
std::cout << "no template: " << n() << '\n';
}
NegativeNumberNoTemplate notemplate(3);
f(notemplate);
J'espère que vous ne voulez pas l'utiliser avec filetage, ils sont pas thread-safe;
Here vous avez tous les exemples; J'espère que cela aide.
est-il énumérer de -1 à -100? –
On dirait que ça ne va que de -1 à -99? –
+1 juste parce que vous êtes le mal –