【问题标题】:C++ Range-V3 dividing an audio stream into ChunksC ++ Range-V3将音频流划分为块
【发布时间】:2015-11-20 02:55:16
【问题描述】:

我正在读取一个 wav 文件,最后将数据推送到 std::array 中。 我需要对数据块进行一些操作。所以我认为这是学习 Eric Niebler 范围的好机会。

我在manual page under "custom ranges" section 中看到了 view_facade,但我看到了这个问题: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 中的哪个标志?

【问题讨论】:

    标签: c++ range-v3


    【解决方案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)) {
        ...
    }
    

    正如我所说,我自己仍在学习图书馆,但希望这会有所帮助。

    【讨论】:

    • 不幸的是不起作用,来自错误消息之一的一小部分:错误:'constexpr const T& range::v3::basic_mixin::get() const' 不能重载 T const &get() const noexcept .
    • 特里斯坦的回答是正确的。我不明白你得到的答案。也许你可以发布你的整个代码。
    • 我编辑了我的问题。我将示例简化为单个文件。我希望现在它更容易理解了。我复制了部分编译输出。
    • @EricNiebler 如果我使用 CONFIG += c++14,我认为问题出在 mingw 标志上,而我只会收到返回类型减少错误。我从 D 语言中知道所谓的“伏地魔类型”很重要,我不想放弃返回类型推导。你知道我应该使用 mingw 中的哪个标志吗?
    • 您的代码使用 -std=c++1y 为我编译。不知道你用的是什么构建工具。我使用 CMake,所以我使用“CMAKE_CXX_FLAGS=-std=c++1y”。 HTH。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2013-10-25
    • 2011-06-08
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多