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

时间:2015-08-28 07:17:33

标签: c++ templates c++11 stl eigen

我有一个派生自Eigen模板的Matrix类:

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

2 个答案:

答案 0 :(得分:7)

  

问题是我想使用模板专门化std::less

唐&#39;吨。 std::less表示&#34;致电<运营商&#34;为这堂课&#34 ;;将它专门用于没有<运算符的类对于阅读代码的其他人来说是不必要的混淆,并且专门用于具有<运算符的类是毫无意义的。

只需实施正确的operator<重载,您就可以在std::map中使用它。

  

我还需要以类似的方式对std::hash进行专门化,以便能够使用std::map

不,你不是。这只是unordered_map所需要的。

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

答案 1 :(得分:5)

正确的语法是

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());
    }
};

这是一个专业化。

顺便说一句,你的实现不尊重要求:(它不对称)。