我正在使用一个具有模板类的库,它存储了传递给它的所有模板类型的std::vector
。
我将std::tuple<A, B, C*>
传递给该模板类(其中A,B,C是我实现的类)。
我想在该类中添加一行,以便在该std::sort
上调用std::vector
。是否有任何方法可以将比较器运算符传递/实现给该特定类型的std::sort
?
首先,我想到为A,B,C编写operator<
,但很快意识到我传递的第三个元组参数是指向C的指针。而且由于该指针不是用户定义的类型,因此我不会能够覆盖默认运算符。
我也读了typename
,但不清楚它的用途,也不知道它是否适用于此。谢谢。
答案 0 :(得分:2)
由于您正在处理标准类型,因此专门针对该类型的比较器并不是很好。在需要时定义自定义比较器和use it更简单,例如:
#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
。
答案 1 :(得分:0)
您可以做的是添加自己的模板化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>{});