我正在阅读“Accelerated C ++”一书,其中一个练习要求我们在标题中模拟“相等”功能,到目前为止,我已经实现了简单版本,它采用如下三个参数:
template <class iterType1, class iterType2>
bool cequal(iterType1 begin, iterType1 end, iterType2 e){
while(begin != end){
if(!(*begin == *e))
return false;
++begin;
++e;
}
return true;
}
和第二个可以接受第四个参数的版本......
template <class iterType1, class iterType2, class boolPred>
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){
while(begin != end){
if(!pred(*begin, *e))
return false;
++begin;
++e;
}
return true;
}
我的问题是,这是理想的做法吗?或者这两个函数是否可以合并?
答案 0 :(得分:3)
第一个版本可以调用第二个版本,将equal_to对象作为最后一个参数传递。 或者您可以将其设置为默认参数。我将其取回。我实际上无法找到一种方法来获得函数模板的默认参数。我甚至无法弄清楚如何在不使用c ++ 0x功能(decltype)的情况下重用重载解决方案中的代码。
template <class iterType1, class iterType2>
bool cequal(iterType1 begin, iterType1 end, iterType2 e){
return cequal(begin, end, e, std::equal_to<decltype(*begin)>());
}
答案 1 :(得分:0)
如果要合并它们,可以为最后一个仅在输入上调用operator==
的参数提供默认谓词。
编辑:一个例子是:
template<typename T1, typename T2>
struct eqpred
{
bool operator(T1 &a, T2 &b) { return a==b; }
}
template <class iterType1, class iterType2, class boolPred=eqpred>
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){
while(begin != end){
if(!pred(*begin, *e))
return false;
++begin;
++e;
}
return true;
}
答案 2 :(得分:0)
这两个函数不仅仅是可合并的,它们几乎完全相同,是行的。
我可以扩展并为你完成所有工作,但那会是一个扰流板。