Как реализована «равная» функция шаблона?(предикатная версия) - PullRequest
2 голосов
/ 19 января 2011

Я работаю над книгой «Ускоренный 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 ]

3 голосов
/ 19 января 2011

Первая версия может вызывать вторую версию, передавая объект 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)>());
}
0 голосов
/ 19 января 2011

Эти две функции не просто объединяемы, они почти одинаковы, строка за строкой.

Я мог бы расширить и сделать все это для вас, но это было бы немного спойлером.

0 голосов
/ 19 января 2011

Если вы хотите объединить их, вы можете предоставить предикат по умолчанию для последнего параметра, который вызывает только 1001 * на входах.

edit: пример будет:

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