сравнить экземпляры типа шаблона и конкретного типа - PullRequest
2 голосов
/ 11 января 2012

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

template<class A> void foo()
{
   A* something=new A(); //new A() mightnot exist
   if(*something==70000)
   {
      cout<<"Item 42\n";
   }
}

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

1 Ответ

1 голос
/ 11 января 2012

В любом сценарии, который может возникнуть подобным образом, при условии, что для вашего класса A определен метод operator==(), и он неявно преобразуется в конкретный тип, с которым сравнивается (т. Е. Явное приведение не требуется), то нет проблем.В противном случае вы получите ошибку компилятора, что хорошо, так как она указывает на ваши ошибки во время компиляции, а не во время выполнения.

Например, представьте себе ваш класс Aопределяется следующим образом:

template<typename T>
class A
{
private:
    T b;

public:
    A(): b(0) {}
    const T& value() const { return b; }

    template<typename U>
    bool operator==(const U& compare) { return compare.value() == b; }
};

Тогда до тех пор, пока:

  1. Тип объекта сравнения U имеет метод с именем value(), который можно вызывать для извлечения его внутреннего объекта.private "value"
  2. Какой бы тип U::value() не возвращался, он сопоставим (и неявно конвертируем) с вашим шаблоном T type

У вас все в порядке.В противном случае вы получите ошибку компилятора с жалобой на один из этих двух пунктов.

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