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