我可以依赖模板类型吗?
Can I rely on template type?
我正在通过示例书研究游戏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_type
不GraphNode
怎么办?
希望你能理解我的问题。
如果node_type
不是GraphNode,那么你的编译器会打你并抛出一个错误。但是,如果你的类依赖于Index
函数,那么你应该把它记录为一个要求,任何 GraphNode 的替代品都必须提供它,可能有一些预期的语义。
鸭子打字。
C++中还有一个方便的功能,称为 SFINAE(替换失败不是错误(,如果依赖于该类型的表达式无法使用特定的具体类型进行编译,它将从考虑的候选对象中删除模板。
一种基于支持的操作限制被接受为模板参数的类型的方法,即概念,最初计划用于 C++0x,但由于委员会对其设计存在分歧而废弃。你仍然可以在GCC的一些分支中找到早期的实现,Boost也有一个概念库。看这里。
C++模板函数在使用点实例化。 也就是说,它将粘贴到您指定时指定的类型中,而不是更早。此时,如果指定的类型没有 Index
成员函数,则编译将失败。
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 当基类是依赖类型时,这是一个缺陷吗
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么依赖模板类型在部分专用化中不可推导?
- 为什么即使直到最后才定义实际类型,也可以将依赖名称视为完整
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- 类型依赖于可变参数模板的类
- 类型依赖模板名称
- 模板类型依赖和继承
- C++中的循环类型依赖项死锁
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- C++使变量类型依赖于用户输入
- 使返回类型依赖于调用源
- 如何专用化基于类型依赖类型的C++模板化类函数
- 将 POD 联合双关到基本类型:依赖于实现或符合标准
- 使用类型依赖模板名的声明
- 非类型模板参数,其类型依赖于另一个参数