【问题标题】:C++ What is the std::for_each() function parameter type?C++ std::for_each() 函数参数类型是什么?
【发布时间】:2013-08-12 19:31:43
【问题描述】:

这是我第一次成功使用 std::for_each() 构造的几个 sn-ps:

struct add_to_memory {
    void operator()(const boost::tuple<const string&, const string&> &t ) {
        m_map.insert(make_pair(t.get<0>(),t.get<1>()));
    }
    add_to_memory(MemoryBank &m) : m_map(m) {};
private:
    MemoryBank &m_map;
};

void
memorize(Block &block) {
    block.get_record_types(record_type_set);
    BOOST_FOREACH(D_RecordType_Set::value_type rec_type, record_type_set) {
        MD_Zip_Range zipper = block.make_field_value_zip_range(rec_type);
        std::for_each(zipper.first, zipper.second, add_to_memory(memory_bank));
    }
}

我现在想将“记忆”更改为一个接受附加参数的函数 - 一个函数或仿函数或任何 add_to_memory() 是什么。但我不知道在签名中使用什么类型。

void scan_block_and_apply_function( Block&, ..?.. );

我正在使用 [read: "stuck with"] g++ 4.4,所以可以肯定地说我没有 c++11。签名应该是什么?又应该怎么调用scan_block_and_apply_function()呢?

【问题讨论】:

    标签: c++ function foreach functor


    【解决方案1】:

    这通常通过模板完成:

    template <typename MemoryBankFunctor>
    void memorize(Block &block, MemoryBankFunctor functor) {
        block.get_record_types(record_type_set);
        BOOST_FOREACH(D_RecordType_Set::value_type rec_type, record_type_set) {
            MD_Zip_Range zipper = block.make_field_value_zip_range(rec_type);
            std::for_each(zipper.first, zipper.second, functor);
        }
    }
    

    【讨论】:

    • F(memory_bank)?你的意思是functor
    • @Chap: 正确...我在打字前忘了考虑:)
    • 我本来应该问这个的,但是 - 你能不能说明一下 memorize() 是如何被调用的?
    • @Chap: memorize(block,add_to_memory(memory_bank)) [请注意,这里有参数的副本,并且可能在 for_each 内部,add_to_memory 的实现必须处理这个问题(即调用仿函数或仿函数的副本应该具有相同的效果)。这基本上意味着状态必须在函子本身之外进行管理——就像你通过持有一个引用所做的那样]
    • 仍然很困惑.. memorize 的原型应该是void memorize(Block&amp;, ..?..); ? (抱歉,这很难掌握。)
    【解决方案2】:

    您传递的是add_to_memory 的一个实例。所以应该这样做:

    void memorize(Block &block, add_to_memory func)
    {
        // ...
        std::for_each(zipper.first, zipper.second, func);
    }
    

    【讨论】:

      【解决方案3】:

      您应该使用模板化参数:

      template <typename T> void scan_block_and_apply_function( Block&, const T& );

      这将允许您使用任何类型的仿函数或函数

      【讨论】:

        猜你喜欢
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 1970-01-01
        相关资源
        最近更新 更多