C++如何知道模板类在编译时支持哪些方法
How does C++ know what methods a template class supports when compiling?
template <typename T>
void func(){
T* t = new T();
t->do_something();
...
}
在这种情况下,编译器如何知道类型名 T 将在其上定义do_something()
方法?在Java中,我们可以指定泛型类扩展的接口,但C++显然没有相同的语法。那么如果我们打电话给func<AClassThatDoesntHaveDoSomethingDefined>()
会发生什么?
您实例化模板函数才知道...与T
.然后它会查找T
是否有这样的方法......否则,您会收到错误。
将模板类型视为占位符,在模板函数实例化之前,不会为模板函数生成代码。因此,如果你有这样的函数并且它从未被调用过,尽管编译器仍然会对其进行一些语法一致性检查,但它不会成为程序集的一部分。这是模板的众多功能之一。
调用 func<AClassThatDoesntHaveDoSomethingDefined>()
时,编译器会将typename T
替换为 AClassThatDoesntHaveDoSomethingDefined
。它将尝试创建如下函数:
void func(){
AClassThatDoesntHaveDoSomethingDefined* t = new AClassThatDoesntHaveDoSomethingDefined();
t->do_something();
...
}
通常的编译规则如下...如果未定义do_something()
,则会收到错误。
这里有一些关于模板的更多信息:https://isocpp.org/wiki/faq/templates
之前不知道 nuthin。使用它们后,模板将转换为代码,并将模板参数替换为占位符。然后编译此生成的代码,如果这些替换参数中的任何一个不符合此新生成的代码的要求,则会收到错误消息。
分阶段思考。
定义以下模板
template<T>
bool func(T val)
{
return val.getstate();
}
在编译过程中,
std::string test;
if (func(test))
找到并触发模板。然后编译器运行并创建
bool func(std::string val)
{
return val.getstate();
}
从模板。一段时间后,在编译过程中,此生成的函数将被编译并发现std::string::getstate
不存在,从而产生错误消息。
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- Windows 脚本主机 - 错误 '800A01B6' 对象不支持此属性或方法
- 我有一个启用了代理存根支持的 ATL 项目,在哪里可以找到 xdlldata.h 文件中所有方法的实现
- VS2017是否有VLA(可变长度阵列)支持解决方法
- 是在32位系统上为Android Studio安装CMAKE的任何方法,以允许C 支持
- 使用C 支持创建Android项目的正确方法
- 适用于 VIM 的 YouCompleteMe 插件 - 如何支持其他库方法的自动完成?(例如OpenMPI)
- 抛出异常:类型错误:对象不支持属性或方法"createVertexArray"(emscripten)
- 使用不受支持的类方法时引发编译器错误
- C++是否提供对异步方法的支持
- 支持多线程方法来构建数组中所有元素的集合吗
- C++如何知道模板类在编译时支持哪些方法
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- C++/C++11使用初始化器列表初始化对象的静态数组/向量的有效方法,并支持基于范围的
- 判断当前字体是否支持unicode字符的简单方法
- gcc支持cbegin和cend方法
- unique_ptr如何同时支持 "dot" 和"arrow"调用以及未定义的方法?
- 有什么方法可以解决 c++ 不支持运行时模板的事实吗?
- 支持XNAWP7和闪存与现有的C++代码库-管道,工具和方法
- 这是实现支持继承的pimpl的有效方法吗?