我有一个 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/