我可以依赖模板类型吗?

Can I rely on template type?

本文关键字:类型 依赖 我可以      更新时间:2023-10-16

我正在通过示例书研究游戏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_type GraphNode的情况下,我怎么能打电话给node.Index()

如果node_typeGraphNode怎么办?

希望你能理解我的问题。

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

鸭子打字。

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

一种基于支持的操作限制被接受为模板参数的类型的方法,即概念,最初计划用于 C++0x,但由于委员会对其设计存在分歧而废弃。你仍然可以在GCC的一些分支中找到早期的实现,Boost也有一个概念库。看这里。

C++模板函数在使用点实例化。 也就是说,它将粘贴到您指定时指定的类型中,而不是更早。此时,如果指定的类型没有 Index 成员函数,则编译将失败。