C ++什么是std :: for_each()函数参数类型?

时间:2013-08-12 19:31:44

标签: c++ function foreach functor

以下是我第一次成功使用std :: for_each()构造时的几个片段:

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));
    }
}

我现在想要将“memorize”更改为一个接受附加参数的函数 - 函数或函子或者它是add_to_memory()的任何函数。但我无法弄清楚签名中使用的类型。

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

我正在使用[读取:“坚持使用”] g ++ 4.4,因此可以肯定地说我没有使用c ++ 11。签名应该是什么?如何调用scan_block_and_apply_function()?

3 个答案:

答案 0 :(得分:2)

这通常通过模板完成:

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);
    }
}

答案 1 :(得分:0)

您传递的内容是add_to_memory的实例。所以这样的事情应该做:

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

答案 2 :(得分:0)

您应该使用模板参数:



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


这将允许您使用任何类型的功能或功能