Применение различных аргументов шаблона C ++ - PullRequest
6 голосов
/ 15 июня 2011

Я пытаюсь создать класс BidirectionalMap, используя (только) STL (нет, повышение не вариант.) У меня 99% процентов работает так, как я хочу, но что я действительно не могу понять как заставить шаблон требовать два разных типа, чтобы оператор [] мог быть корректно переопределен. Что-то вроде ...

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

Ответы [ 2 ]

15 голосов
/ 15 июня 2011

Просто добавьте следующую частичную специализацию:

template <typename T>
class BidirectionalMap<T, T>;

В этом случае компилятор создаст экземпляр шаблона, который не определен (поскольку вышеизложенное только объявлено), и выдаст залог, если пользователь попытается передатьтот же тип, что и у обоих аргументов шаблона.

6 голосов
/ 15 июня 2011

Конечно реальный вопрос: Почему такое произвольное ограничение?

Я бы посчитал совершенно нормальным иметь тот же тип, что и ключ и значение, поэтому, вместо обеспечения неоднозначной перегрузки оператора, возможно, вы могли бы просто предоставить два разных метода?

ValueType const& by_key(KeyType const&) const;
KeyType const& by_value(ValueType const&) const;

и покончим с этим.

РЕДАКТИРОВАТЬ : После замечания Георгия Фрицше:)

Помните, что одним из первостепенных правил перегрузки является то, что все перегрузки должны иметь одинаковое основное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...