Как создать функцию может использовать пользовательский сопоставимый C ++? - PullRequest
0 голосов
/ 20 мая 2018

Я пытался создать функцию, которой нужно два, сравнить два объекта, но я хочу, чтобы она была пригодна для использования с любыми сопоставимыми, как работает std :: sort.

Другими словами, я хочу, чтобы эти коды компилировалисьв C ++

bool mycomp(int a, int b) {return a<b;}
int main () {
   deque<int> qu;
   special_push(qu, 3);
   special_push(qu, 5, less<int>());
   special_push(qu, 5, mycomp);
}

Я пробовал до сих пор:

template< typename _Compare > void push (deque<int> & qu,int val, _Compare comp = less<int>()) {
    while(qu.empty()==false &&  comp(val, qu.back())) {
      qu.pop_back();
    }
    qu.push_back(val);

}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Вы почти у цели.Все, что вам не хватает, это тип по умолчанию для вас Compare.Я также рекомендую новый std::less<>, который имеет шаблонный оператор.

template <class Compare = std::less<>>
//                      ^~~~~~~~~~~~~
auto special_push(std::deque<int> & qu, int val, Compare comp = std::less<>{}) -> void
{
    while(!qu.empty() && comp(val, qu.back()))
    {
      qu.pop_back();
    }
    qu.push_back(val);
}
0 голосов
/ 20 мая 2018

После исправления очевидных опечаток, то, что вам не хватало, было значением по умолчанию для параметра шаблона:

#include <deque>
#include <functional>

using std::deque;
using std::less;

bool mycomp(int a, int b) {return a<b;}

template< typename _Compare = std::less<int> >
void special_push (deque<int> & qu,int val, _Compare __comp = less<int>()) {
    while(qu.empty()==false &&  __comp(val, qu.back())) {
      qu.pop_back();
    }
    qu.push_back(val);

}

int main () {
   deque<int> qu;
   special_push(qu, 3);
   special_push(qu, 5, less<int>());
   special_push(qu, 5, mycomp);
}

В качестве альтернативы, вы могли бы использовать перегруженную функцию (это часто то, что libstdc ++ делает внутренне, ноЯ не знаю ни одной причины, чтобы сделать это таким образом.)

Обратите внимание, что есть также несколько стилистических или педантичных проблем, которые вы, вероятно, должны решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...