我正在重新实施std::map
。我需要确保任何数据类型(基本或用户定义)密钥都可以使用它。我将Map类声明为模板,其中包含键和值的两个参数。我的问题是,如果我需要使用字符串作为键类型,我如何重载<和>仅用于字符串类型键的运算符?? 在模板特化中,我们必须根据我的理解使用我们需要的类型专门化整个类。
有什么方法可以用更好的方式做到这一点吗?如果我添加一个单独的Key类并将其用作Key的模板类型怎么办?
答案 0 :(得分:1)
您应该将比较分解为类型,就像普通std::map
那样。也就是说,有一个实用工具类less_compare
:
template <typename T>
struct less_compare
{
bool operator()(const T& pLhs, const T& pRhs) const
{
return pLhs < pRhs;
}
};
然后:
template <typename Key, typename Value, typename Compare = less_compare<Key> >
class map
{
// ...
private:
Compare mCompare;
};
要比较两个值,请执行:if (mCompare(someThing, someOtherThing))
,someThing
为“小于”someOtherThing
时为真。请注意,此分解还允许用户定义的比较(这就是引用“小于”的原因)。这被称为基于策略的设计。
现在你可以专门为C字符串专门设置less_compare
类。 (还提供greater_compare
和亲属。)
请记住,除非这是为了学习,否则你不应该实现自己的地图。另请注意,std::string
已经operator<
已超载。
答案 1 :(得分:0)
您也可以使用type traits。它将为您提供一个框架,以解决类型之间可能存在的未来差异。