Как я могу реализовать генератор в C++?

Я закончил тем, что фиксировал его путем переустановки SQL Server 2008. Это не было вообще оптимально, но если кто-то сталкивается с подобной проблемой убедиться знать, что этот маршрут будет, вероятно, работать.

11
задан einpoklum - reinstate Monica 13 July 2016 в 15:03
поделиться

4 ответа

Вы не можете этого сделать, правда, но вы можете подделать это. Вот способ подделки на C , который также можно использовать в C ++.

5
ответ дан 3 December 2019 в 02:40
поделиться

В C ++ есть «итераторы». Один явно запрашивает интегратор, явно увеличивает его и разыменовывает его.

Если вы хотите, чтобы они использовались со стандартными библиотечными функциями, они должны в основном быть производными от std :: forward_iterator и реализовывать количество его функций.

Другой способ имитировать вид генератора в коллекции - разрешить функцию в качестве аргумента функции-члена, которая передает (выдает) все свои значения этой функции:

struct MyCollection {
    int values[30];

    template< typename F >  
    void generate( F& yield_function ) const {
       int* end = values+30; // make this better in your own code :)
       for( auto i: values ) yield_function( *i );
    }
};

// usage:
c.generate([](int i){ std::cout << i << std::endl; });

// or pre-C++11:
struct MyFunction { 
    void operator() (int i)const { printf( "%d\n", i); }
};
MyCollection c;
c.generate( MyFunction() );
11
ответ дан 3 December 2019 в 02:40
поделиться

Чтобы уточнить реализацию итератора: это пример. Его можно использовать как переменную цикла или в алгоритмах std.

#include <iterator>

template< typename T, typename TDiff = T >
struct TGenerator : public std::iterator<std::forward_iterator_tag,T,TDiff> {
  T from,to;
  T value;
  TDiff step;
  bool issentinel;

  TGenerator( T from, T to, TDiff step, bool sentinel = false )
    : from(from),to(to),step(step),issentinel(sentinel), value(from)
  {}

  void operator++(){ value += step; }

  const T& operator*()const { return value; }

  bool operator!=( const TGenerator& other ) const {
    return value<to;
  }

  TGenerator sentinel()const { return TGenerator(0,0,0,true); }

};


#include <algorithm>
#include <iostream>

int main()
{
  TGenerator<int> i(0,10,3);
  std::copy( i, i.sentinel(), std::ostream_iterator<int>( std::cout, " " ) );

    return 0;
}
5
ответ дан 3 December 2019 в 02:40
поделиться

Вызов сопрограммы несколько раз и получение разных ответов означает, что вы сохраняете какое-то состояние. Способ сохранить состояние - это объекты. Способ сделать их похожими на вызов функции - это перегрузка оператора. См. http://en.wikipedia.org/wiki/Function_object .

1
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: