执行不同的C++模板参数

Rob*_*ris 6 c++ templates

我尝试使用(仅)STL创建一个BidirectionalMap类(不,boost不是一个选项.)我有99%的工作方式,我想要的方式,但我真正想不到的是如何强制模板需要两种不同的类型,以便可以正确覆盖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.
} 
Run Code Online (Sandbox Code Playgroud)

思考?-R

Kon*_*lph 15

只需添加以下部分特化:

template <typename T>
class BidirectionalMap<T, T>;
Run Code Online (Sandbox Code Playgroud)

这将使编译器实例化一个未定义的模板(因为上面只是声明)并且如果用户试图传递与两个模板参数相同的类型则保释.

  • 请务必在该声明下方添加一条有用的评论,向用户解释他们做错了什么.这基本上是他们的错误信息. (3认同)

Mat*_* M. 6

当然真正的问题是:为什么会有这样的任意限制?

我认为与键和值具有相同类型是完全正常的,因此您可以简单地提供两种不同的方法,而不是提供模糊的运算符重载?

ValueType const& by_key(KeyType const&) const;
KeyType const& by_value(ValueType const&) const;
Run Code Online (Sandbox Code Playgroud)

并完成它.

编辑:关注@Georg Fritzsche的评论:)

请记住,重载的最重要规则之一是所有重载都应具有相同的基本含义.