gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:46 26 4
gpt4 key购买 nike

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

最佳答案

你应该把比较作为一个类型来分解,就像普通的 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 .请注意,此因式分解还允许用户定义的比较(这就是引用“小于”的原因)。这称为基于策略的设计。

现在您可以专门化 less_compare C 字符串类。 (同时提供 greater_compare 和 kin。)


请记住,除非这是为了学习,否则您不应该实现自己的 map 。另请注意 std::stringoperator<已经重载了。

关于c++ - 用户定义的类作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2871055/

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