我正在通过示例书从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
??
希望你理解我的问题。
答案 0 :(得分:7)
如果node_type
不是GraphNode,那么你的编译器会砸你并抛出一个错误。但是,如果您的类依赖于Index
函数,那么您应该将其记录为一个要求,并且GraphNode的任何替换都必须提供它,可能还有一些预期的语义。
答案 1 :(得分:3)
在C ++中还有一个名为SFINAE(替换失败不是错误)的便捷功能,如果依赖于该类型的表达式无法使用特定的具体类型进行编译,则会从所考虑的候选项中删除模板。
基于支持的操作(即Concepts)限制接受为模板参数的类型的方法最初是针对C ++ 0x计划的,但由于委员会对其设计的不同意见而被废弃。您仍然可以在GCC的某些分支中找到早期实现,Boost也有一个概念库。请参阅here。
答案 2 :(得分:2)
C ++模板函数在使用时实例化。即,它会粘贴您指定的类型 时指定它们,而不是更快。此时,如果您指定的类型没有Index
成员函数,则编译将失败。