我可以依赖模板类型吗?

时间:2011-05-31 19:40:48

标签: c++ templates

我正在通过示例书从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()

还有班级

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 个答案:

答案 0 :(得分:7)

如果node_type不是GraphNode,那么你的编译器会砸你并抛出一个错误。但是,如果您的类依赖于Index函数,那么您应该将其记录为一个要求,并且GraphNode的任何替换都必须提供它,可能还有一些预期的语义。

答案 1 :(得分:3)

Duck typing

在C ++中还有一个名为SFINAE(替换失败不是错误)的便捷功能,如果依赖于该类型的表达式无法使用特定的具体类型进行编译,则会从所考虑的候选项中删除模板。

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

答案 2 :(得分:2)

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