2011-01-19 2 views
2

Я работаю над книгой «Ускоренный С ++», и одно из упражнений требует, чтобы мы эмулировали «равную» функцию в заголовке, и до сих пор я реализовал простую версию, которая принимает три параметра следующим образом:Как реализована функция «равных» шаблонов? (предикатная версия)

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

Первая версия может вызывать вторую версию, передавая объект 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

Проблема с 'equal_to' заключается в том, что он ожидает, что 2 операнда будут иметь один и тот же тип, тогда как его функция имеет 2 разных типа для своих операндов. – Blindy

+0

@Blindy: Его функция имеет разные типы для итераторов, но это не означает, что типы элементов не будут одинаковыми. Я думаю, маловероятно, что вы захотите сравнить два разных типа в любом случае, и это вызовет ошибку, если вы попытаетесь. Я не вижу в этом проблемы. Если это то, что он хочет, он может, конечно, использовать другую функцию. –

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

Я думал об этом, но я не знаю синтаксиса, чтобы установить параметр по умолчанию для оператора == – Moin

+0

@Moin, обновленный на примере. – Blindy

+0

Это работает? Это потребует, чтобы вы явно передали 'boolPred' в качестве последнего аргумента, а IIRC вы не можете давать аргументы по умолчанию в шаблонах функций. – templatetypedef

0

Эти две функции не только объединяемы, они почти точно так же, линия для линии.

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

Смежные вопросы