2013-06-13 4 views
0

Я хочу создать такие значения: (я должен использовать следующий синтаксис). Таким образом, целью является создание значений с помощью STL-функции generate_n и класс-функтор «Sequencegenerator», который является функцией шаблона. Моя проблема в том, что я не знаю, как вернуть значение и как сохранить его для следующего вызова. Вниз есть мой код ... большое вам спасибо! (Я должен решить, не используя оператор()Как вернуть значение без вызова функции?

// Numbers from 1 to 10 
generate_n(ostream_iterator<int>(cout, " "), 10, SequenceGenerator<int>(1)); 
cout << endl; 
// Numbers from 10 to 1 (descending order) 
generate_n(ostream_iterator<int>(cout, " "), 10, SequenceGenerator<int>(10, -1)); 
cout << endl; 
// Numbers from 0 to 5 (increment 0.5) 
generate_n(ostream_iterator<double>(cout, " "), 11, SequenceGenerator<double>(0, 0.5)); 
cout << endl; 
// Letters from A to Z 
generate_n(ostream_iterator<char>(cout, ""), 26, SequenceGenerator<char>(’A’)); 
cout << endl; 

МОЙ КОД:

#include <algorithm> 
#include <iterator> 
#include <iostream> 
#include "SequenceGenerator.h" 

using namespace std; 

template <typename T> 
class SequenceGenerator : public std::unary_function<T,T> 
{ 
public: 
    SequenceGenerator(T const start, T const inc):mStart(start),mInc(inc) 
    { 
     return mStart = mStart + inc; 
    } 

private: 
    T const mInc; 
    static T mStart; //static T mStart 
}; 



int main() 
{ 
    generate_n(ostream_iterator<int>(cout, " "), 10, SequenceGenerator<int>(10,1)); 


    return 0; 
} 
+0

Я уверен, что 'static' здесь не то, что вам нужно ... –

+4

Кроме того, почему вы хотите избежать' operator() '? –

+0

Предполагается, что это время компиляции? –

ответ

2

Вы не можете избежать operator() здесь, потому что это то, что функция std::generate_n призывает экземпляры вашего SequenceGenerator шаблона

.

Реализация шаблона, который будет работать, выглядит следующим образом:

template <typename T> 
class SequenceGenerator 
    : public std::unary_function<T,T> // This is superfluous for this usage 
{ 
public: 
    SequenceGenerator(T const start, T const inc = 1) 
     : mStart (start) 
     , mInc (inc) 
    { 
    } 

    T operator()() 
    { 
     T ret = mStart; 
     mStart += mInc; 
     return ret; 
    } 

private: 
    T const mInc; 
    T mStart; 
}; 
Смежные вопросы