2014-10-11 3 views
2

Я учусь C++, проработав много с Haskell и функциональными языками в целом, и я обнаружил, что я постоянно пытаюсь решить ту же проблему:Как написать настраиваемое преобразование потока в C++?

  • прочитать некоторые данные из входного потока
  • разметить их на основе определенного алгоритма
  • процесса лексемы

Если бы это был Haskell, я мог бы просто воспользоваться тем, что все это лень, и написать свою трансформацию, как я думаю об этом, а затем это будет g et, который используется в качестве нисходящего потока. Существуют даже библиотеки, которые делают этот точный шаблон (conduit и pipes).

Предположим, что я хотел взять последовательность 1 2 3 4 5 6 ... и вывести 12 34 56 .... Я могу видеть, как написать специальный код, который работает с потоком и обрабатывает данные. Но я хотел бы знать , если есть механизм абстракции, который позволяет мне создавать новый поток, преобразовывая данные (каким-либо мыслимым способом) из другого потока. Эта абстракция должна позволять мне буферизовать данные по мере обработки, а не просто сопоставление одного элемента с новым значением.

Вот ограничения:

  • Я не могу использовать любую другую библиотеку, кроме STDLIB.
  • Он должен работать на C++ 03 (имеется в виду не C++ 11 функций.)

Если вы думаете, это домашнее задание? Хорошо, я получаю много назначений классов, которые требуют от меня работать с потоками данных (что является причиной отсутствия библиотеки и ограничений C++ 03). Дело не в том, что я не знаю, как это сделать, используя петли while, но я хотел бы знать, существует ли существующая потоковая абстракция в stl, просто ожидая ее обнаружения и использования.

Но если единственный способ сделать это - использовать C++ 11, то я хотел бы знать.

+0

Нет готового пакета, о котором я знаю. Возможно, пользовательский тип класса, используемый с 'std :: istream_iterator'? –

+0

@ T.C. хм, это может быть то, что я ищу. Если я правильно понимаю, я бы использовал пользовательский итератор, который принимает входной поток и который производит нужный мне результат? Что делать, если я хотел взять один итератор и построить из него еще один итератор (думаю, композиция)? –

+0

Я думал о классе с пользовательским оператором извлечения потока, который использовался с ['std :: istream_iterator'] (http://en.cppreference.com/w/cpp/iterator/istream_iterator). Что касается композиции, вам нужно будет написать свои собственные адаптеры итераторов. –

ответ

0

Концептуальный код, не проверен. Imaging существует много ошибок и правильного синтаксиса.

struct add : public std::binary_function<int,int,int> { 
    int operator() (int a, int b) {return (a + b);} 
}; 

template<typename inType, typename dType, typename outType, class binFunc> 
outType Transformer(inType& inStream, outType& outStream, binFunc func) { 
    dType a, b; 
    // Read some data from an input stream 
    // Tokenize them based on a specific algorithm 
    inStream>> a >> b; 
    //outStream << func(a, b); 
    return func(a,b); // Process the tokens 
} 

int main() { 
    std::ifstream in("input.dat", std::ifstream::in); // , std::ios::binary 
    std::ofstream out("output.dat"); 
    struct add adder; // to Process the tokens 

    out << Transformer(in, out, adder); 

    return exit_success; 
} 
0

Следующая не подходит к вашей потребности не-библиотеки-решения (и у меня нет достаточной репутации оставить его в качестве комментария); тем не менее, это будет удобно для вашего функционального мышления.

David Sankel дал отличную беседу о FRP, используя C++ на C++ Now 2014. Он даже предоставил библиотеку, которую они используют для производства.

видео можно найти здесь: https://www.youtube.com/watch?v=tyaYLGQSr4g&list=UU5e__RG9K3cHrPotPABnrwg

Слайды связаны с описанием видео и GitHub ссылки в конце слайдов.

Я подозреваю, вы также получите вдохновение здесь: http://ericniebler.com/2013/11/07/input-iterators-vs-input-ranges/

станд :: преобразование с потоковыми итераторы должны в основном делать то, что вам нужно.

 Смежные вопросы

  • Нет связанных вопросов^_^