重写定义为c ++

时间:2015-07-08 08:28:31

标签: c++

Hy,有可能将这两个定义重写为c ++代码功能吗? 我想删除#Define

定义1:

#define DO_ALL_BLOCK_IP(iter)   \
    for ((iter) = m_block_ip.begin(); (iter) != m_block_ip.end(); ++(iter))

定义2:

#define DO_ALL_BLOCK_EXCEPTION(iter) \
    for ((iter) = m_block_exception.begin(); (iter) != m_block_exception.end(); ++(iter))

3 个答案:

答案 0 :(得分:3)

不直接 - 如果DO_ALL_BLOCK_IP(iter) {/* code here */}是函数,则语法DO_ALL_BLOCK_IP无效。

只要不需要直接使用迭代器(只有值),就可以使用新的C ++范围进行语法编写:

for(auto& value : m_block_ip)
{
    // code here
}

如果你必须出于某种原因使用某个函数,你可以传递一个函子,并使用lambda表达式来定义:

// definition (assuming m_block_ip is a vector of block_ip_t)
void DO_ALL_BLOCK_IP(std::function<void(std::vector<block_ip_t>::iterator)> f) {
    for(auto iter = m_block_ip.begin(); iter != m_block_ip.end(); iter++)
        f(iter);
}

// alternate definition that *may* be more efficient, but also more cumbersome
template<class F_CLASS> void DO_ALL_BLOCK_IP(F_CLASS f) {
    for(auto iter = m_block_ip.begin(); iter != m_block_ip.end(); iter++)
        f(iter);
}

// how to call
DO_ALL_BLOCK_IP([&](std::vector<block_ip_t>::iterator iter) {
    // code here
});

答案 1 :(得分:1)

您的宏基本上是某些代码的前缀,这些代码将为范围中的每个迭代器执行某些操作。虽然你无法使用函数完全相同,但函数std::for_each已经完成了这个功能。使用lambda函数,它看起来像这样:

std::for_each(nums.begin(), nums.end(), 
    [](int &n){ 
        // Doing something with an element of nums
        // and maybe something else
        // In a block that looks pretty much like you would
        // use with your macro.
        // Note that instead of continue, you'd use return, though.
    });

答案 2 :(得分:0)

由于这适用于块,因此无法直接重写函数。不幸的是,你需要改变每种用法。

如果DO_ALL_BLOCK_IP是一个函数,则无法编译。

DO_ALL_BLOCK_IP(x)
{
    // stuff
}

你可以做的只是使用标准库算法或range-for循环(可能使用lambda)。