C++11 中 std::less 的模板特化,使用模板

Template specialization for std::less in C++11, using a template

我有一个矩阵 class 派生自 Eigen 模板:

template<typename T,
         int _Rows = Eigen::Dynamic,
         int _Cols = Eigen::Dynamic>
class Matrix : public Eigen::Matrix<T, _Rows, _Cols>

我需要将此类型用作 std::map 容器的键,因此我需要一个比较器对象。为此,我想专门研究 std::less。未编译的草稿版本如下所示,让您了解一下:

template<typename Matrix<typename T,
                         int _Rows = Eigen::Dynamic,
                         int _Cols = Eigen::Dynamic> > >
struct less
{
    bool operator()(const Matrix<T,
                                 Rows,
                                 Cols>& lhs,
                    const Matrix<T,
                                 Rows,
                                 Cols>& rhs) const;
    {
      Matrix<T,
             Rows,
             Cols>::const_iterator lhsIt = lhs.begin();
      Matrix<T,
             Rows,
             Cols>::const_iterator rhsIt = rhs.begin();
      for (;
           lhsIt != lhs.end();
           ++lhsIt, ++rhsIt)
      {
        if (*lhsIt < *rhsIt)
        {
          return true;
        }
      }
      return false;
    }
};

问题是我想使用模板专门化 std::less。对此进行编码的正确方法是什么?我必须求助于模板专业化吗?

我还需要以类似的方式专门化 std::hash 才能使用 std::map

正确的语法是

template <typename T, int Row, int Col>
struct less<Matrix<T, Row, Col>>
{
    bool operator()(const Matrix<T, Row, Col>& lhs,
                    const Matrix<T, Row, Col>& rhs) const
    {
        // implementation:
        return lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
    }
};

这是一个专业。

顺便说一句,您的实施不符合 less 要求:(它不是对称的)。

The problem is that I want to specialize std::less using a template.

不要。 std::less 对于这个 class 意味着 "call the < operator"”;将它专门用于没有 < 运算符的 class 会不必要地混淆阅读您的代码的其他人,并将其专门用于带有 < 运算符的 class 毫无意义。

只需实施正确的 operator< 重载,您就可以在 std::map.

中使用它

I will also need to specialize std::hash in a similar way to be able to use std::map.

不,你不知道。只有 unordered_map.

才需要

顺便说一句,你的比较算法是错误的。它报告 [2, 1] < [1, 2] [1, 2] < [2, 1]。更不用说它不处理两个矩阵具有不同数量的元素的情况。