【问题标题】:How to create a function may use custom comparable C++?如何创建一个可以使用自定义可比 C++ 的函数?
【发布时间】:2018-05-19 23:35:15
【问题描述】:

我试图创建一个需要两个比较两个对象的函数,但我希望它可以与 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);

}

【问题讨论】:

  • 双下划线开头的名称和下划线加大写字母开头的名称保留给编译器
  • 是的,我是从编译器复制过来的
  • 编译器实现者可以这样做——你不可以。
  • 谢谢,但该代码不适用于正式项目,所以没关系,但我更新了它。
  • 这很重要 - 使用保留名称是将几乎不可能找到的错误引入代码的好方法。

标签: c++ function templates


【解决方案1】:

在修正了明显的拼写错误之后,您缺少的是模板参数的默认值:

#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++ 在内部执行的操作,但我不知道有任何理由这样做)。

请注意,您可能还应该解决几个风格或迂腐的问题。

【讨论】:

  • 不知道您的意思是“请注意,您可能还应该解决一些风格或迂腐的问题。”因为英语不是我的第一语言
【解决方案2】:

你快到了。您所缺少的只是Compare 的默认类型。我还推荐新的std::less&lt;&gt;,它有一个模板化的操作符。

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

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多