Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用函子模板实现自定义比较器_C++_Templates_C++11 - Fatal编程技术网

C++ 用函子模板实现自定义比较器

C++ 用函子模板实现自定义比较器,c++,templates,c++11,C++,Templates,C++11,我想为诸如下限、查找等函数编写自定义比较器。下面是一个自定义比较器的示例,该比较器使用一个接受另一个函数对象的函子实现(std::less,std::greater,等等)并使用它将一对中的第一个元素与函数的第二个参数进行比较 template <template <typename> class P = std::less> struct custom_comp { template <class T1, class T2> bool ope

我想为诸如
下限
查找
等函数编写自定义比较器。下面是一个自定义比较器的示例,该比较器使用一个接受另一个函数对象的函子实现(
std::less
std::greater
,等等)并使用它将一对中的第一个元素与函数的第二个参数进行比较

template <template <typename> class P = std::less>
struct custom_comp {
    template <class T1, class T2>
    bool operator()(const std::pair<T1, T2>& pair, const T1& val)
    {
            return P<T1>()(pair.first, val);
    }
}
模板
结构自定义组件{
模板
布尔运算符()(常数std::pair&pair,常数T1&val)
{
返回P()(pair.first,val);
}
}
用法示例:

vector<pair<int,int>> vec = {{1, 4}, {3, 3}, {5, 6}, {8, 8}};
auto first = lower_bound(begin(vec), end(vec), 5, custom_comp<>());
vec={{1,4},{3,3},{5,6},{8,8};
自动优先=下限(开始(vec),结束(vec),5,自定义补偿();
然而,
()
让我烦恼,我觉得它剥夺了可读性。有办法摆脱它吗?(可能是将函子更改为另一种结构)

顺便说一句:我不想使用lambdas,因为我想重用这些自定义比较器,甚至扩展它们以获取更多的模板参数(例如自定义过滤器,例如获取一对并返回
对的函子。首先
,或者取向量平均值的函子,等等)

然而,
()
让我很烦恼

不应该。代码没有问题。有时候你需要做那种事。这并没有真正影响可读性,很清楚那里发生了什么

如果需要,您可以随时创建“默认”自定义组件:

constexpr custom_comp<> def_custom_comp{};

您丢失了
()
,但我不确定这是否一定更容易理解

您可以将
custom\u comp
更改为
custom\u comp\u which
,然后创建
custom\u comp\u which custom\u comp(){}
模板custom\u comp\u whichcustom\u comp(){}
自由重载函数,提供实际的比较器,这是否适合您?用custom\u-less,custom-great增强可读性,…谢谢,删除之前的评论,但保留我对原始烦人语法的偏好。我更喜欢看
custom\u comp()
,因为它向读者宣布“这是一个具有默认模板参数的模板实例”,这是使用中介时隐藏的东西。谢谢你把它修好。
auto first = lower_bound(begin(vec), end(vec), 5, def_custom_comp);