在模板专门化中优化循环和避免代码重复
Optimizing loop and avoiding code duplication in a template specialization
假设我们有一个函数
template< typename A, typename B, typename C >
void function(vector<A>& keyContainer, int a, int b, int c, boost::function<bool(B&)> selector, C* objPointer = NULL)
{
BOOST_FOREACH(const A& key, keyContainer)
{
B* pVal = someGetObjFunction(objPointer, key);
if(pVal)
{
if(selector && selector(*pVal))
{
pVal->someOtherFunction(1,2,3);
}
//some more code
}
}
}
这看起来很糟糕,因为它总是会进入
if(selector && selector(*pVal))
即使是NULL,修复这个问题的一个明显的方法是:
template< typename A, typename B, typename C >
void function(vector<A>& keyContainer, int a, int b, int c, boost::function<bool(B&)> selector, C* objPointer = NULL)
{
if(selector)
{
BOOST_FOREACH(const A& key, keyContainer)
{
B* pVal = someGetObjFunction(objPointer, key);
if(pVal)
{
if(selector(*pVal))
{
pVal->someOtherFunction(1,2,3);
}
//some more code
}
}
}
else
{
BOOST_FOREACH(const A& key, keyContainer)
{
B* pVal = someGetObjFunction(objPointer, key);
if(pVal)
{
pVal->someOtherFunction(1,2,3);
//some more code
}
}
}
}
但是这导致了大量的代码重复,另一种方法是在函数为NULL的情况下进行专门化,但这不与上面的例子几乎相同吗?有没有其他方法可以做到这一点,而不需要复制所有的代码?
你的问题描述有点令人困惑。您没有检查NULL,因为selector
不是指针。相反,您要检查boost::function
对象是否为empty()
(参见:http://www.boost.org/doc/libs/1_55_0/doc/html/boost/function.html#idp54857000-bb)。
同样,你的两个代码块是不相等的。您似乎表明,如果(提供选择器和 true) 或(未提供选择器),您想要执行内部循环。
所以,你的第一个代码块应该是:template< typename A, typename B, typename C >
void function(vector<A>& keyContainer, int a, int b, int c, boost::function<bool(B&)> selector, C* objPointer = NULL)
{
BOOST_FOREACH(const A& key, keyContainer)
{
B* pVal = someGetObjFunction(objPointer, key);
if(pVal)
{
if(!selector || (selector && selector(*pVal)))
{
pVal->someOtherFunction(1,2,3);
}
//some more code
}
}
}
逻辑上等同于你的第二块代码。
正如Igor Tendetnik所提到的,您需要实际测量代码以查看瓶颈在哪里。很可能不是检查选择器是否为空。
如果检查选择器是否为空确实是你的瓶颈,这是不太可能的,因为打开优化的编译器将使这些比较非常快内联函数调用,你可以缓存空测试的结果。
template< typename A, typename B, typename C >
void function(vector<A>& keyContainer, int a, int b, int c, boost::function<bool(B&)> selector, C* objPointer = NULL)
{
bool check_selector = !selector.empty();
BOOST_FOREACH(const A& key, keyContainer)
{
B* pVal = someGetObjFunction(objPointer, key);
if(pVal)
{
if(!check_selector || (check_selector && selector(*pVal)))
{
pVal->someOtherFunction(1,2,3);
}
//some more code
}
}
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在这个代码结束循环中没有得到结束
- 下面是我为检测链接列表中的循环而制作的代码
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 在java中解决这段代码时面临循环中的问题
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 如何编译使用循环引用的代码?
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 在C/C 中使用检查功能的Windows NT命令行代码循环
- 我想不出一种方法来使我的代码循环
- 使用 SIMD 管理累积(单个)值的清理代码循环的方法是什么
- 我如何让我的部分代码循环并重复一个问题,直到答案是有效的输入C++
- C 代码循环问题
- 如何仅使用if-else语句(no-for、do/while等)使此代码循环一定次数?(c++)
- 如何运行代码循环 if (a==b) 并且不循环如果 a != b 没有"else"
- 用相同的代码循环遍历对象和指针
- 如何使我的代码循环(与arduino)