C++如何知道模板类在编译时支持哪些方法?

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>()会怎么样?

Whi*_*TiM 7

在您实例化模板函数之前,编译器不知道T.然后它会查找是否T有这样的方法......如果没有,你会得到一个错误.

考虑像占位符这样的模板类型,没有为模板函数生成代码,直到用类型实例化.因此,如果你有这样的函数并且它从未调用过,虽然编译器仍会进行一些语法一致性检查,但它不会成为程序集的一部分.这是模板的众多功能之一.

当你调用func<AClassThatDoesntHaveDoSomethingDefined>(),编译器的替换typename TAClassThatDoesntHaveDoSomethingDefined.它会尝试创建一个这样的函数:

void func(){
  AClassThatDoesntHaveDoSomethingDefined* t = new AClassThatDoesntHaveDoSomethingDefined();
  t->do_something();
  ...
}
Run Code Online (Sandbox Code Playgroud)

通常的编译规则如下......如果do_something()没有定义,您将收到错误.

这里有关于模板的更多信息:https://isocpp.org/wiki/faq/templates