为模板类中的特定类型编写比较器函数

时间:2018-06-22 23:49:19

标签: c++ c++11 templates

我正在使用一个具有模板类的库,它存储了传递给它的所有模板类型的std::vector

我将std::tuple<A, B, C*>传递给该模板类(其中A,B,C是我实现的类)。

我想在该类中添加一行,以便在该std::sort上调用std::vector。是否有任何方法可以将比较器运算符传递/实现给该特定类型的std::sort

首先,我想到为A,B,C编写operator<,但很快意识到我传递的第三个元组参数是指向C的指针。而且由于该指针不是用户定义的类型,因此我不会能够覆盖默认运算符。

我也读了typename,但不清楚它的用途,也不知道它是否适用于此。谢谢。

2 个答案:

答案 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>{});