我尝试使用(仅)STL创建一个BidirectionalMap类(不,boost不是一个选项。)我有百分之九十九的工作方式我想要的,但我真的无法弄清楚是如何强制模板需要两种不同的类型,以便可以正确覆盖operator []。有点像...
template < class KeyType, class ValueType >
class BidirectionalMap
{
public:
...
const ValueType& operator[](const KeyType& _k ) { return( m_keyMap[ _k ] ); }
const KeyType& operator[](const ValueType& _v ) { return( m_valMap[ _v ] ); }
private:
std::map< KeyType > m_keyMap;
std::map< ValueType > m_valueMap;
};
main()
{
BidirectionalMap< Foo, Foo > fooMap; // won't work, ambiguous.
BidirectionalMap< Foo, Bar > fooBarMap; // does work.
}
思考? -R
答案 0 :(得分:15)
只需添加以下部分专业化:
template <typename T>
class BidirectionalMap<T, T>;
这将使编译器实例化一个未定义的模板(因为只声明了上述内容)并且如果用户试图传递与两个模板参数相同的类型,则保释。
答案 1 :(得分:6)
当然真正的问题是:为什么会出现这样的任意限制?
我认为与键和值具有相同的类型是完全正常的,因此,您可以简单地提供两种不同的方法,而不是提供模糊的运算符重载吗?
ValueType const& by_key(KeyType const&) const;
KeyType const& by_value(ValueType const&) const;
并完成它。
编辑:关注@Georg Fritzsche的评论:)
请记住,重载的最重要规则之一是所有重载应该具有相同的基本含义。