回覆列表
  • 1 # 使用者52510796211

    有的時候,我們由於某一些特殊的需求,希望獲取一個函式的返回值型別,或者是引數數量,可以藉助模板來實現。假如我們有一個函式int f(double, float) { return 1; }當我們需要獲取返回值型別的時候,我們首先宣告一個模板函式。template <class R, class... Args> R getRetValue(R(*)(Args...));這個函式不需要被實現,因為我們只是想得到它的返回值型別,並不是真的呼叫這個函式,此時我們可以透過以下一句話獲取函式型別using ret_t = decltype(getRetValue(f));decltype是根據進數返回值進行型別推斷的,只需要拿到函式宣告即可,並不在乎這個函式是不是真的被定義了。當函式中傳入了引數f之後,模板會自動地進行型別推斷,將返回值傳遞給R,將引數型別double, float打包傳遞給Args。此時ret_t 就是函式f的返回值型別int。如果我們需要獲取引數的個數,那麼可以用如下程式碼來實現:template <class R, class... Args> constexpr size_t getNumArgs(R(*)(Args...)) { return sizeof...(Args); }跟上面的做法類似,使用sizeof...可以獲取引數的個數。當函式是類成員函式的時候,上面的兩個函式需要對應修改為:template <class R, class C, class... Args> R getRetValue(R(C::*)(Args...)); template <class R, class C, class... Args> constexpr size_t getNumArgs(R(C::*)(Args...)) { return sizeof...(Args); }其中(C::*)表示這是類C的一個成員函式指標,當我們傳入一個類成員函式指標時候,R、C、Args都會被對應的推斷出來。

  • 中秋節和大豐收的關聯?
  • 怎麼評價吃雞遊戲中利用假車庫從P城西北部切入中心城區的打法思路?