如何解决将指针作为函数参数传递与非类型模板参数之间的区别
我无法理解两者之间的区别
- 将指针作为函数参数传递
- 将指针作为非类型模板参数传递
您能否帮助了解通过选择 2 实现的优化(特别是从快速委托的上下文中,如解释 here 和使用的 here)?
关于使用指针作为非类型参数的一些困惑是
解决方法
当在编译时解析指针时,编译器如何知道指针指向什么?
因为模板就是这样工作的。尽管模板很复杂,但模板的基本思想非常简单。
模板是一个(智能)宏。当您实例化模板时,您基本上是在创建模板的副本,其中模板参数的每次使用都被在实例化时传递的相应参数替换。
所以:
template<func_ptr ptr>
void func1();
{
ptr();
}
func1<some_func>();
在功能上等同于:
void func2()
{
some_func();
}
func2();
编译器如何知道 func2
会调用 some_func
?因为这就是您在代码中所写的内容。编译器如何知道 func1<some_func>
会调用 some_func
?因为这就是您在代码中编写的内容,当您将其命名为 func1<some_func>
时。
当成员函数可以是虚函数时,如何在编译时解析成员函数指针?
这完全取决于您所说的“已解决”是什么意思。
假设函数调用成员指针的类不是 final
(你不能从 final
类继承,所以编译器知道要调用哪个函数),编译器无法确定将调用哪个覆盖。
然而,编译器确实知道覆盖在哪里。假设我们讨论的是基于 vtable 的虚函数实现,一个成员指针包含一个指向 vtable 的索引,编译器将使用它来查找实际的覆盖函数。但是如果成员指针在编译时是已知的,那意味着索引在编译时也是已知的。所以编译器不需要动态索引到表中;它可以静态索引它。
所以在某种程度上,它可以被认为是在编译时“解决”了覆盖。至少,在可能的范围内。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。