2

我正在阅读“Accelerated C++”一书,其中一项练习要求我们模拟标题中的“equal”函数,到目前为止,我已经实现了简单版本,它采用以下三个参数:

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;
}

我的问题是,这是理想的方法吗?还是这两个功能可以合并?

4

3 回答 3

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)>());
}
于 2011-01-19T02:02:15.110 回答
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;
}
于 2011-01-19T02:02:19.017 回答
0

这两个函数不仅是可合并的,它们几乎完全相同,逐行。

我可以扩展并为你做这一切,但这会有点剧透。

于 2011-01-19T02:02:57.650 回答