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]
。更不用说它不处理两个矩阵具有不同数量的元素的情况。
我有一个矩阵 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 usestd::map
.
不,你不知道。只有 unordered_map
.
顺便说一句,你的比较算法是错误的。它报告 [2, 1] < [1, 2]
和 [1, 2] < [2, 1]
。更不用说它不处理两个矩阵具有不同数量的元素的情况。