繁体   English   中英

为什么可以在 C++ 中将函数指针作为模板参数传递?

[英]Why is possible to pass a function pointers as template parameters in C++?

让我们考虑一下摘录:

void myFunc(int a, int b) {}

template<void(*function_pointer)(int, int)> 
class TakeFunctionPointer {
public:
  TakeFunctionPointer() {
    function_pointer(5, 6);
  }
};

int main() {
  TakeFunctionPointer<myFunc> tfp{};
}

这段代码编译得很好,效果很好,但我担心为什么编译器允许将函数指针放入模板参数中,因为我知道 C++ 中的模板是静态多态的一部分,并且预计首先编译器会实例化所有模板类然后运行它们。 因此,这意味着编译器能够获取具有给定签名的函数地址,并将该地址实际放置。 这允许类调用方便的函数。 怎么来的?

为什么编译器允许将函数指针放入模板参数中?

因为标准说是允许的。

因此,这意味着编译器能够获取具有给定签名的函数地址,并将该地址实际放置。

正确的。

class类型模板参数和值类型参数之间存在差异。 当您有一个已经给出实际类型的模板时,例如

template<std::size_t N> /* class or function... */

您正在处理一个值参数。 对于指向函数的特定指针也是如此,例如

template<void(*function_pointer)(int, int)> /* ... */

您可以使用与签名匹配的特定函数引用来实例化此模板,并且在模板的定义中,您可以使用此值。

请注意,使用这样的函数指针,即在编译时,是可行的,因为无论如何必须在编译时知道函数及其签名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM