让我们考虑一下摘录:
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)> /* ... */
您可以使用与签名匹配的特定函数引用来实例化此模板,并且在模板的定义中,您可以使用此值。
请注意,使用这样的函数指针(即在编译时(是可行的,因为函数及其签名无论如何都必须在编译时已知。