Могу ли я рассчитывать на тип шаблона? - PullRequest
1 голос
/ 31 мая 2011

Я изучаю рабочий код из Game AI на примере книги, и есть часть, которую я не понимаю.

Есть

template <class node_type, class edge_type>   
class SparseGraph                                 
{ ... };

и

int SparseGraph<node_type, edge_type>::AddNode(node_type node)
{
  if (node.Index() < (int)m_Nodes.size())
...
}    

Как можно назвать node.Index()? 1010 *

Там также есть класс

class GraphNode
{  
public:
...   
  int  Index()const{return m_iIndex;}
....
};   

и график создается с помощью этого класса

typedef SparseGraph<GraphNode, GraphEdge> NavGraph;
NavGraph * m_pGraph;

так я понимаю, что делает node.Index(), НО Как я могу позвонить node.Index(), хотя нет никакой гарантии, что node_type это GraphNode.

что если node_type не GraphNode ??

Надеюсь, вы понимаете мой вопрос.

Ответы [ 3 ]

7 голосов
/ 31 мая 2011

Если node_type не является GraphNode, то ваш компилятор ударит вас и выдаст ошибку. Однако, если ваш класс зависит от функции Index, вы должны задокументировать ее как требование и любая замена для GraphNode должна предоставить ее, возможно, с некоторой ожидаемой семантикой.

3 голосов
/ 31 мая 2011

Утка набрав .

В C ++ также есть удобная функция, называемая SFINAE (ошибка замещения не является ошибкой), которая удаляет шаблон из рассмотренных кандидатов, если выражение, зависящее от типа, не будет компилироваться с конкретным конкретным тип.

Способ ограничения типов, принимаемых в качестве параметров шаблона, на основе поддерживаемых операций, т. Е. Концепции, изначально планировался для C ++ 0x, но был отклонен из-за разногласий комитета по его проекту. Вы все еще можете найти ранние реализации в некоторых форках GCC, и Boost также имеет библиотеку концепций. Смотри здесь .

2 голосов
/ 31 мая 2011

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

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