2015-07-08 2 views
-1

Hy, можно ли переписать эти два определения как функцию кода C++? Я хочу удалить #defineRewrite определяет как C++

Определение 1:

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

Define2:

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

Как это * не * C++? – user2357112

+0

Я имею в виду, как функция. Я хочу удалить #define и переписать как функцию –

+2

Ваши определения не являются полными операторами (тело цикла 'for' отсутствует), поэтому вы не сможете их заменить для функций без изменения каждого сайта вызова. –

ответ

0

Так как это работает на блоках, это не сразу можно переписать на функции. К сожалению, вам нужно будет изменить каждое использование.

Если DO_ALL_BLOCK_IP была функцией, это не скомпилировалось.

DO_ALL_BLOCK_IP(x) 
{ 
    // stuff 
} 

Что вы можете сделать вместо этого просто использовать стандартные библиотечные алгоритмы или диапазон для контура (возможно, с использованием лямбды).

+0

Проверьте файл, может быть, он поможет вам http://pastebin.com/LtyDtJJ7 –

+0

И спасибо, я попробую –

3

Непосредственно - синтаксис DO_ALL_BLOCK_IP(iter) {/* code here */} недействителен, если DO_ALL_BLOCK_IP - это функция.

Вы можете использовать новый C++ диапазона синтаксиса, до тех пор, пока вы не должны использовать итератор непосредственно (только значение):

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

Если вы должны использовать функцию для некоторых причина, вы могли бы передать его функтор и использовать лямбда-выражения, чтобы определить, что:

// 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

Ваши макросы в основном префикс для некоторого кода, который будет делать что-то для каждого итератора в диапазоне. Хотя вы не можете сделать точно те же функции, функция std::for_each уже в значительной степени делает это; с лямбда-функциями, это может выглядеть так:

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. 
    }); 
+0

Обратите внимание, что не существует эквивалента 'break'. Возможно, вам понадобится 'std :: find'. – MSalters

+0

Спасибо, @MSalters, это очень хорошие моменты. –