One*_*ero 3 c++ generics templates
template <typename T>
void func(){
T* t = new T();
t->do_something();
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器如何知道typename T将在do_something()
其上定义一个方法?在Java中,我们可以指定泛型类扩展的接口,但C++显然没有相同的语法.那么如果我们打电话func<AClassThatDoesntHaveDoSomethingDefined>()
会怎么样?
在您实例化模板函数之前,编译器不知道T
.然后它会查找是否T
有这样的方法......如果没有,你会得到一个错误.
考虑像占位符这样的模板类型,没有为模板函数生成代码,直到用类型实例化.因此,如果你有这样的函数并且它从未调用过,虽然编译器仍会进行一些语法一致性检查,但它不会成为程序集的一部分.这是模板的众多功能之一.
当你调用func<AClassThatDoesntHaveDoSomethingDefined>()
,编译器的替换typename T
用AClassThatDoesntHaveDoSomethingDefined
.它会尝试创建一个这样的函数:
void func(){
AClassThatDoesntHaveDoSomethingDefined* t = new AClassThatDoesntHaveDoSomethingDefined();
t->do_something();
...
}
Run Code Online (Sandbox Code Playgroud)
通常的编译规则如下......如果do_something()
没有定义,您将收到错误.
这里有关于模板的更多信息:https://isocpp.org/wiki/faq/templates