c++ - 我如何为多种键类型专门化标准映射?

标签 c++ templates specialization

我有一个 std::map 的子类

template<class ValueT>
FancyKeyMap
    : public std::map<FancyKey,ValueT, FancyKey::Less>
{
     ...
public:
     inline iterator find(FancyKeyArg key)
     {
         return(std::map<FancyKey,ValueT,
                FancyKey::Less>::find(FancyKeyArg.makeKeyRef()));
     }  
};

这工作正常,(不要问我为什么不想使用一些隐式转换,这会导致太多不明确的重载,而且在这种情况下完全转换很昂贵:)

无论如何,如果上面的内容可以是 std::map 的特化,那将会很好

std::map<FancyKey,ValueT> fancymap;

会做同样的事情

FancyKeyMap<ValueT> fancyMap;

可以做这种类型的特化吗?


好的,只是尝试了部分特化:

namespace std {

template<class ValT, class CompareT=FancyKey::Less, 
         class AllocT=allocator<pair<const FancyKey,ValT> > >
    class map<FancyKey, ValT, CompareT, AllocT>
{
     ....
};

}

我收到这个错误:

“部分特化不允许使用默认参数”

但要让它像 std::map 一样工作,它需要有“继承的”默认参数 允许它们被覆盖。下一步是可能的吗?

我确实看到了关于具有可搜索模板常见问题解答的建议,这似乎是一个非常常见的问题;^>

最佳答案

避免键入 makeKeyRef()(在 find 调用中)并同时更明确地说明意图似乎很麻烦。您是否考虑过只进行额外的输入并向 future 的维护者明确说明您的意图?

此外,由于标准容器没有虚拟析构函数,除非您非公开继承,否则当某个容器被基类指针销毁时,您将面临未定义的行为。

关于c++ - 我如何为多种键类型专门化标准映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6529077/

相关文章:

c++ - 连接时字符串 '\0' null 出错

c++ - 我究竟应该在我的 OpenGL C++ 项目中的什么地方添加我的 BMP 文件?使用适用于 Mac 的 Xcode

c++ - 为什么 Eigen 不需要模板关键字来使用 Matrix 的模板函数调用?

html - 如何在golang中使用html

c++ - 模板类中单个方法的模板特化

c++ - 是否可以专门研究某些(不是全部)类模板参数?

c++ - 如何专门化模板类中的模板成员函数?

c++ - 如何在不提供源代码的情况下向某人提供 c/c++ 程序

c++ - 这段代码是如何工作的?

google-app-engine - 访问 golang 模板中引用对象的属性(Google 应用引擎)