为模板类中的特定类型编写比较器函数
Writing a comparator function for specific type within template class
我正在使用一个库,该库具有模板类,它存储传递给它的所有模板类型的std::vector
。
我std::tuple<A, B, C*>
传递给该模板类(其中 A、B、C 是我实现的类(。
我想为该类添加一行额外的行,我将在该类中调用该std::vector
std::sort
。有没有办法传递/实现比较器运算符来std::sort
适用于该特定类型?
首先,我想为 A、B、C 编写operator<
,但很快意识到我传递的第三个元组参数是指向 C 的指针。由于指针不是用户定义的类型,因此我将无法覆盖默认运算符。
我也读过typename
但我不清楚它的用途,也不知道它是否适用于这里。谢谢。
由于您正在处理标准类型,因此专门为该类型专门使用比较器并不是那么好。定义自定义比较器并在需要时使用它更简单,例如:
#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>
using tuple_t = std::tuple<int, float, int*>;
int main()
{
auto comparator = [](const tuple_t& t1, const tuple_t& t2)
{
if (std::get<0>(t1) == std::get<0>(t2))
return *std::get<2>(t1) < *std::get<2>(t2);
else
return std::get<0>(t1) < std::get<0>(t2);
};
std::vector<tuple_t> data;
std::sort(data.begin(), data.end(), comparator);
}
如果您真的发现自己经常调用std::sort
,或者您想为类型提供所需的运算符,那么最好定义自定义类型而不是使用std::tuple
。
您可以做的是添加自己的模板化MyComparator<T>
类,该类在所有情况下默认为std::less<T>
,除了std::tuple<A,B,C*>
:
template<typename T> struct MyComparator : public std::less<T>
{};
template<> struct MyComparator<std::tuple<A,B,C*>>
{
// your own operator() here
};
然后只需在模板内部的std::sort
中使用该压缩器:
std::sort(std::begin(v), std::end(v), MyComparator<T>{});
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 为模板类中的特定类型编写比较器函数
- 有什么东西可以一般地反转C++比较器类型
- 如何为数据类型 vector<glm::vec3> (opengl 数据类型) 编写 std::minmax 函数的自定义比较器
- C++函数来返回基于参数的比较器通用映射类型?
- 如何使用is_transparent类型的比较器
- 比较器类型错误
- 如何在c++中声明带有指针类型比较器的set
- 标准算法比较器接受不同类型的对象是否合法?