2015-11-20 1 views
2

Я читаю wav-файл и в конце передаю данные в std :: array. Мне нужно выполнить некоторую операцию на кусках данных. Поэтому я подумал, что это хорошая возможность изучить диапазоны Эрика Ниблера.C++ Range-V3, делящий аудиопоток на куски

Я видел view_facade в manual page under "custom ranges" section, но я видел этот вопрос: link. Теперь я не уверен, как создать собственный класс диапазона. Может ли кто-нибудь помочь мне в этом? В приведенном ниже коде показано, чего я пытаюсь достичь.

#include <iostream> 
#include <range/v3/all.hpp> 

using namespace ranges; 
using namespace std; 


struct A 
{ 
    static constexpr size_t MAX_SIZE = 100000; 


    A() 
    { 
     for (size_t i = 0; i < MAX_SIZE; i++) 
      data[i] = i; 
     size = MAX_SIZE; 
    } 

    auto begin() const { return data.begin(); } 
    auto end() const { return data.end(); } 


    std::array< double , MAX_SIZE > data; 
    size_t size; 

}; 

int main() 
{ 
    A instance; 
    RANGES_FOR(auto chunk, view::all(instance) | view::chunk(256)) { 

    } 
    return 0; 
} 

Часть выхода компиляции:

14:47:23: Running steps for project tryOuts... 
14:47:23: Configuration unchanged, skipping qmake step. 
14:47:23: Starting: "C:\Qt\Tools\mingw491_32\bin\mingw32-make.exe" 
C:/Qt/Tools/mingw491_32/bin/mingw32-make -f Makefile.Debug 
mingw32-make[1]: Entering directory 'C:/Users/Erdem/Documents/build-tryOuts-Desktop_Qt_5_4_2_MinGW_32bit-Debug' 
g++ -c -pipe -fno-keep-inline-dllexport -std=gnu++1y -pthread -lpthread -O3 -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -I"..\tryOuts" -I"." -I"..\..\..\..\range-v3-master\include" -I"D:\cvOutNoIPP\install\include" -I"..\..\..\..\Qt\5.4\mingw491_32\mkspecs\win32-g++" -o debug\main.o ..\tryOuts\main.cpp 
In file included from ..\..\..\..\range-v3-master\include/range/v3/utility/iterator.hpp:28:0, 
       from ..\..\..\..\range-v3-master\include/range/v3/begin_end.hpp:24, 
       from ..\..\..\..\range-v3-master\include/range/v3/core.hpp:17, 
       from ..\..\..\..\range-v3-master\include/range/v3/all.hpp:17, 
       from ..\tryOuts\main.cpp:2: 
..\..\..\..\range-v3-master\include/range/v3/utility/basic_iterator.hpp:445:22: error: 'constexpr const T& ranges::v3::basic_mixin<Cur>::get() const' cannot be overloaded 
      T const &get() const noexcept 
        ^

------------ Обновление ------------------ -------------------------

Если я добавлю CONFIG + = C++ 14, код почти скомпилируется, кроме ошибок с ошибкой автоматического возврата типа ниже:

main.cpp: 22: выводимый тип возврата доступен только с -std = C++ 1y или -std = gnu ++ 1y

, чтобы избежать этих ошибок, я использую CONFIG + = C++ 1y. Но в этом случае я получаю кучу ошибок, которые я отправляю на первое место. Я знаю из языка D, так называемые «типы Волдеморта» важны, я не хочу отказываться от возвращаемого типа. Какой флаг в gcc использовать?

ответ

1

Я все еще изучаю библиотеку диапазонов самостоятельно, но я понимаю, что в представлении могут использоваться те, которые раскрывают STL-совместимые методы begin() и end(). Так, например, с Reader класса вы могли бы

struct Reader { 
    // ... 

    auto begin() const { return rawData.begin(); } 

    auto end() const { return rawData.end(); } 

}; 

Затем можно использовать view::all(), чтобы создать представление вокруг Reader, что-то вроде

Reader r; 
RANGES_FOR(auto chunk, view::all(r) | view::chunk(256)) { 
    ... 
} 

Как я сказал, я все еще учусь сама библиотека, но, надеюсь, это поможет.

+0

К сожалению, не работает небольшая часть из одного из сообщений об ошибке: error: 'constexpr const T & range :: v3 :: basic_mixin :: get() const' не может быть перегружен T const & get() const noexcept. –

+0

Ответ Тристана правильный. Я не понимаю ответа, который у вас есть. Возможно, вы можете опубликовать весь свой код. –

+0

Я отредактировал мой вопрос. Я упростил пример в одном файле. Надеюсь, теперь это более понятно. И я скопировал часть компиляции. –

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