[英]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.