如何实现“平等”模板功能? (谓词版)

时间:2011-01-19 01:49:57

标签: c++ stl-algorithm

我正在阅读“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;
}

我的问题是,这是理想的做法吗?或者这两个函数是否可以合并?

3 个答案:

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

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

我可以扩展并为你完成所有工作,但那会是一个扰流板。