用户定义的类作为模板参数

时间:2010-05-20 04:42:41

标签: c++ dictionary templates std stdmap

我正在重新实施std::map。我需要确保任何数据类型(基本或用户定义)密钥都可以使用它。我将Map类声明为模板,其中包含键和值的两个参数。我的问题是,如果我需要使用字符串作为键类型,我如何重载<和>仅用于字符串类型键的运算符?? 在模板特化中,我们必须根据我的理解使用我们需要的类型专门化整个类。
有什么方法可以用更好的方式做到这一点吗?如果我添加一个单独的Key类并将其用作Key的模板类型怎么办?

2 个答案:

答案 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。它将为您提供一个框架,以解决类型之间可能存在的未来差异。

相关问题