簡體   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