Неопределенность объявления структуры шаблона пары c ++! - PullRequest
0 голосов
/ 04 июля 2010

В определении класса пары в c ++ есть два определения типа.для чего они?их нет в коде!

template <class T1, class T2> struct pair
{
  typedef T1 first_type;
  typedef T2 second_type;

  T1 first;
  T2 second;
  pair() : first(T1()), second(T2()) {}
  pair(const T1& x, const T2& y) : first(x), second(y) {}
  template <class U, class V>
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { }
}

Ответы [ 4 ]

7 голосов
/ 04 июля 2010

Они здесь только для вашего удобства, поэтому вы можете использовать их в своем коде.В C ++ нет модели отражения, так что это единственный способ узнать, что это за типы. Предположим, вы определяете свою собственную пару

typedef pair MyPair;

Тогда вы можете использовать

MyPair :: first_type
MyPair :: second_type

, например,

MyPair::first_type my_first(MyPair& pair)
{
    return pair.first;
}

Тогда вы выиграли 'Если вы измените исходное определение MyPair, вам нужно будет искать и заменять его везде.

5 голосов
/ 04 июля 2010

Это позволяет другим частям кода объявлять переменные типов без прямого доступа к параметрам типа (T1 и T2).Аналогичным, менее тривиальным примером являются typedef в классах контейнеров:

vector<int>::iterator curNum;
for(curNum = someVect.begin(); curNum != someVect.end(); curNum++)
    ; //do stuff

При этом используется typedef iterator, определенный в шаблоне вектора для создания curNum.Несколько менее полезно будет использовать ключевое слово C ++ 0x auto:

for(auto curNum = someVect.begin(); curNum != someVect.end(); curNum++)
    ;
3 голосов
/ 04 июля 2010

Это так, что вы можете ссылаться на типы в вашем коде, используя, например, pair<int,string>::first_type myVariable, или, если вы определили определенный вариант шаблона, то MyPair::first_type myVariable.

1 голос
/ 04 июля 2010

Это открытые псевдонимы переданных типов T1 и T2, на которые можно ссылаться после создания объекта.

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