如何为多种密钥类型专门化std映射?

时间:2011-06-30 01:27:05

标签: 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()));
     }  
};

这个工作正常,(不要问为什么我不想使用一些implicint转换,这会导致太多模糊的重载,在这种情况下完全转换也很昂贵:)

无论如何,如果以上可能是std :: map的特殊化,那么​​它会很好看

std::map<FancyKey,ValueT> fancymap;

woudl做与

相同的事情
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一样,它需要具有“继承”默认args 允许它们被覆盖。下一步可能吗?

我确实看到了有可搜索模板常见问题解答的建议,看起来这似乎是一个非常常见的问题; ^&gt;

1 个答案:

答案 0 :(得分:0)

避免键入makeKeyRef()(在find调用中)并在同一时间更明确地表达意图似乎很麻烦。您是否考虑过进行额外的打字并让未来的维护人员明白您的意图?

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