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))
答案 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)。