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