gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:00 28 4
gpt4 key购买 nike

我有一个派生自 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

最佳答案

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

不要。 std::less意思是“为这个类调用 < 运算符”;将它专门用于没有 < 运算符的类会不必要地混淆其他阅读您的代码的人,并且将它专门用于具有 < 运算符的类是没有意义的。

只需执行一个正确的 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] .更不用说它无法处理两个矩阵具有不同数量元素的情况。

关于c++ - C++11 中 std::less 的模板特化,使用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com