簡體   English   中英

如何初始化升壓滾動 window 累加器?

[英]How to initialize a boost rolling window accumulator?

我想初始化一個升壓滾動 window 累加器,而不必在 function 調用中進行分配。

這是我看到每個人所做的:

boost::accumulators::accumulator_set<double, boost::accumulators::stats<boost::accumulators::tag::rolling_mean>> acc(boost::accumulators::tag::rolling_window::window_size = 10);

如果在上面的構造函數調用中沒有賦值,我怎么能制作相同的累加器?

這不是作業,而是命名參數成語 C++ 沒有那個,真的,所以這就是為什么它看起來像一個賦值:它是一個表達式模板

您當然可以找出類型並使用它,但這不會有任何區別,只會使正確使用庫變得更加困難:

boost::parameter::aux::tagged_argument_list_of_1<
    boost::parameter::aux::tagged_argument<
        boost::accumulators::tag::rolling_window_size_<0>, const int>>
    init(10);

ba::accumulator_set<double, ba::stats<ba::tag::rolling_mean>> acc(init);

我不了解你,但我更喜歡命名參數表達式。


您顯然可以編寫一個幫助程序 function 來刪除庫詳細信息:

auto make_accum(int window) {
    return ba::accumulator_set<
        double,
        ba::stats<ba::tag::rolling_mean>> (ba::tag::rolling_window::window_size = window);
}

int main() {
    auto acc = make_accum(10);
}

這只是使用有關您集合中的統計信息的知識將命名參數變成位置參數。

如果您擔心泛型代碼,只需在泛型情況下將表達式作為初始化程序傳遞。 這就是庫 istelf 的實現方式:

template <typename Stats, typename... Init> auto generic_accum(Init const&... init) {
    return ba::accumulator_set<double, Stats> (init...);
}

演示所有 3 種方法

住在科利魯

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>

namespace ba = boost::accumulators;

template <typename Stats, typename... Init> auto generic_accum(Init const&... init) {
    return ba::accumulator_set<double, Stats> (init...);
}

auto make_accum(int window) {
    return ba::accumulator_set<
        double,
        ba::stats<ba::tag::rolling_mean>> (ba::tag::rolling_window::window_size = window);
}

int main() {
    {
        boost::parameter::aux::tagged_argument_list_of_1<
            boost::parameter::aux::tagged_argument<
            boost::accumulators::tag::rolling_window_size_<0>, const int>>
            init(10);

        ba::accumulator_set<double, ba::stats<ba::tag::rolling_mean>>
            acc(init);
    }

    {
        auto acc = make_accum(10);
    }

    {
        auto acc = generic_accum<ba::stats<ba::tag::rolling_mean>>(ba::tag::rolling_window::window_size = 10);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM