Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指针作为函数参数传递与非类型模板参数传递之间的区别_C++_C++17_Signals Slots_Member Function Pointers_Non Type Template Parameter - Fatal编程技术网

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委托的上下文中) 关于指针作为非类型参数的使用,我的一些困惑是 当指针在编译时解析时,编译器如何知道指针指向什么 当成员函数可以是虚拟函数时,如何在编译时解析成员函数指针 当指针在编译时解析时,编译器如何知道指针指向什么 因为模板就是这样工作的。尽管模板非常复杂,但其基本思想非常简单 模板是(智能)宏。当您实例化一个模板时,您基本上是在创建一个模板的副

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

  • 将指针作为函数参数传递
  • 将指针作为非类型模板参数传递
  • 请您帮助理解通过选择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
    不会给它链接,但会给它静态存储持续时间,这是必需的。