#include using namespace std; template class Generator { public: virtual T operator()() = 0; }; // Does nothing unspecialized template class PowersGenerator: Generator {}; // Specialize with other types, or provide a generic version of pow template class PowersGenerator: Generator { public: int i; PowersGenerator() { i = 1; } virtual int operator()() { int o = 1; for(int j = 0; j < P; ++j) o *= i; ++i; return o; } }; // Only works with non-decreasing generators template class Filter: Generator { public: G gen; F filter; T lastG, lastF; Filter() { lastG = gen(); lastF = filter(); } virtual T operator()() { while(lastG >= lastF) { if(lastG == lastF) lastG = gen(); lastF = filter(); } T out = lastG; lastG = gen(); return out; } }; int main() { Filter, PowersGenerator> gen; for(int i = 0; i < 20; ++i) gen(); for(int i = 20; i < 30; ++i) cout << i << ": " << gen() << endl; }