C++ 将指针作为函数参数传递与非类型模板参数传递之间的区别
我无法理解两者之间的区别C++ 将指针作为函数参数传递与非类型模板参数传递之间的区别,c++,c++17,signals-slots,member-function-pointers,non-type-template-parameter,C++,C++17,Signals Slots,Member Function Pointers,Non Type Template Parameter,我无法理解两者之间的区别 将指针作为函数参数传递 将指针作为非类型模板参数传递 请您帮助理解通过选择2实现了什么优化(特别是从解释和使用的fast委托的上下文中) 关于指针作为非类型参数的使用,我的一些困惑是 当指针在编译时解析时,编译器如何知道指针指向什么 当成员函数可以是虚拟函数时,如何在编译时解析成员函数指针 当指针在编译时解析时,编译器如何知道指针指向什么 因为模板就是这样工作的。尽管模板非常复杂,但其基本思想非常简单 模板是(智能)宏。当您实例化一个模板时,您基本上是在创建一个模板的副
template<func_ptr ptr>
void func1();
{
ptr();
}
func1<some_func>();
编译器如何知道func2
将调用some\u func
?因为这就是你在代码里写的。编译器如何知道func1
将调用some\u func
?因为这就是你命名它时在代码中写的func1
当成员函数可以是虚拟函数时,如何在编译时解析成员函数指针
这完全取决于你所说的“已解决”是什么意思
假设函数调用成员指针的类不是final
(您不能从final
类继承,因此编译器确切地知道要调用哪个函数),编译器无法准确地确定将调用哪个重写
但是,编译器确实知道覆盖的位置。假设我们讨论的是基于vtable的虚拟函数实现,则成员指针包含vtable的索引,编译器将使用该索引查找实际的重写函数。但如果成员指针在编译时已知,则意味着索引也在编译时已知。因此编译器不需要动态索引到表中;它可以静态索引它
因此,在某种程度上,可以认为它已经在编译时“解决”了重写。至少,在可能的范围内
当指针在编译时解析时,编译器如何知道指针指向什么
因为模板就是这样工作的。尽管模板非常复杂,但其基本思想非常简单
模板是(智能)宏。当您实例化一个模板时,您基本上是在创建一个模板的副本,其中模板参数的每次使用都被实例化时传递的相应参数所替换
因此:
template<func_ptr ptr>
void func1();
{
ptr();
}
func1<some_func>();
编译器如何知道func2
将调用some\u func
?因为这就是你在代码里写的。编译器如何知道func1
将调用some\u func
?因为这就是你命名它时在代码中写的func1
当成员函数可以是虚拟函数时,如何在编译时解析成员函数指针
这完全取决于你所说的“已解决”是什么意思
假设函数调用成员指针的类不是final
(您不能从final
类继承,因此编译器确切地知道要调用哪个函数),编译器无法准确地确定将调用哪个重写
但是,编译器确实知道覆盖的位置。假设我们讨论的是基于vtable的虚拟函数实现,则成员指针包含vtable的索引,编译器将使用该索引查找实际的重写函数。但如果成员指针在编译时已知,则意味着索引也在编译时已知。因此编译器不需要动态索引到表中;它可以静态索引它
因此,在某种程度上,可以认为它已经在编译时“解决”了重写。至少在可能的范围内。谢谢您的回复。我做了更多的研究,发现下面的模板参数对象应该有不断的破坏。其指针传入的变量必须具有外部链接。那么函数指针在每个作用域中也有外部链接吗?@Discretizer:函数不是对象,所以函数指针不指向变量。在函数示例中,函数指针作为参数传递与模板参数传递之间有区别吗?除非函数以某种方式内联,否则似乎不会进行优化。@Discretizer:自C++17以来,链接一直不是模板参数要求。@Discretizer:生成局部变量
static
不会给它链接,但会给它静态存储持续时间,这是必需的。感谢您的回复。我做了更多的研究,发现下面的模板参数对象应该有不断的破坏。其指针传入的变量必须具有外部链接。那么函数指针在每个作用域中也有外部链接吗?@Discretizer:函数不是对象,所以函数指针不指向变量。在函数示例中,函数指针作为参数传递与模板参数传递之间有区别吗?除非函数以某种方式内联,否则似乎没有优化。@Discretizer:自C++17以来,链接一直不是模板参数的要求。@Discretizer:生成局部变量static
不会给它链接,但会给它静态存储持续时间,这是必需的。