2011-05-31 110 views
1

我正在研究从游戏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()叫什么名字?

也有类

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

和图形与此类

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

让我明白了什么node.Index()做创建,但 我怎么能叫node.Index()虽然没有保证node_typeGraphNode

如果node_type不是GraphNode

希望你能理解我的问题。

+3

我想你需要一本好书,告诉你模板是如何工作的。 “鸭子打字”是关键字。 – Xeo 2011-05-31 19:45:45

+1

@Xeo:如果您不想阅读由熟悉动态编程语言的人撰写的大量博客文章,请参阅“参数多态性”。 :-P – ildjarn 2011-05-31 20:00:17

+0

@ildjarn:但鸭子打字听起来更好。 :( – Xeo 2011-05-31 20:46:35

回答

7

如果node_type不是GraphNode,那么你的编译器会打你并且抛出一个错误。但是,如果你的类依赖于Index函数,那么你应该把它作为一个需求来记录,任何GraphNode的替代品都必须提供它,可能需要一些预期的语义。

+1

+1对于所有这些谈话都有些贬低。:-) – 2011-05-31 19:44:33

+0

+1。 – phooji 2011-05-31 19:46:52

+0

好的,那么为此使用模板的目的是什么?我可以用基类GraphNode和多态来做到,不是吗? – relaxxx 2011-05-31 19:56:03

2

C++模板函数在使用时被实例化。即,当您指定时,它会粘贴您指定的类型,并且不会更早。此时,如果您指定的类型没有Index成员函数,则编译将失败。

3

Duck typing

C++中还有一个很方便的功能叫做SFINAE(替换失败不是错误),如果依赖于类型的表达式不能用特定的具体类型进行编译,它将从被考虑的候选项中移除一个模板。

基于支持的操作(即Concepts)限制接受为模板参数的类型的方法最初是为C++ 0x计划的,但由于委员会在其设计上存在分歧而被废弃。您仍然可以在GCC的某些分支中找到早期实现,并且Boost也有一个概念库。请参阅here

相关问题