微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将指针作为函数参数传递与非类型模板参数之间的区别

如何解决将指针作为函数参数传递与非类型模板参数之间的区别

我无法理解两者之间的区别

  1. 将指针作为函数参数传递
  2. 将指针作为非类型模板参数传递

您能否帮助了解通过选择 2 实现的优化(特别是从快速委托的上下文中,如解释 here 和使用的 here)?

关于使用指针作为非类型参数的一些困惑是

  1. 在编译时解析指针时,编译器如何知道指针指向什么?
  2. 当成员函数可以是虚函数时,如何在编译时解析成员函数指针?

解决方法

当在编译时解析指针时,编译器如何知道指针指向什么?

因为模板就是这样工作的。尽管模板很复杂,但模板的基本思想非常简单。

模板是一个(智能)宏。当您实例化模板时,您基本上是在创建模板的副本,其中模板参数的每次使用都被在实例化时传递的相应参数替换。

所以:

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 举报,一经查实,本站将立刻删除。