为什么在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)> /* ... */

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

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

最新更新