使用仿函数模板实现自定义比较器

时间:2015-07-31 15:41:00

标签: c++ templates c++11

我想为lower_boundfind等函数编写自定义比较器。下面是一个自定义比较器的示例,该比较器使用带有另一个函数对象(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);
    }
}

用法示例:

vector<pair<int,int>> vec = {{1, 4}, {3, 3}, {5, 6}, {8, 8}};
auto first = lower_bound(begin(vec), end(vec), 5, custom_comp<>());

然而,<>()困扰我,我觉得它带走了可读性。有办法摆脱它吗? (也许改变另一种结构的仿函数)。

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

1 个答案:

答案 0 :(得分:6)

  

然而<>()困扰我

不应该。该代码没有错。有时你需要做那样的事情。它并没有真正消除可读性,它非常清楚那里发生了什么。

如果你愿意,你可以随时创建&#34;默认&#34; custom_comp

constexpr custom_comp<> def_custom_comp{};

然后使用它:

auto first = lower_bound(begin(vec), end(vec), 5, def_custom_comp);

你失去了<>(),但我不确定这一点是否更容易理解。