簡體   English   中英

在類中強制使用可變參數模板成員函數實例化

[英]Forcing variadic template member function instantiation in class

我有一個具有可變成員函數的類:

class class_name {
  template<ArgTypes.. args>
  some_return_type memberMethod(ArgTypes... args) {
    //stuff...
  }
}

我需要強制在類定義塊中實例化此方法。 我在類定義塊之外刪除了方法名稱,因為該類是由一堆宏生成的。

我嘗試通過復制指向專用成員函數(偽代碼)的指針來強制實例化:

template<typename Self, typename RetType, typename... ArgTypes>
struct force_instantation_imlp<Self, RetType, type_placeholder, type_placeholder<ArgTypes...>> {
    force_instantation_imlp() {
        using instate = RetType (Self::*)(ArgTypes...);
        instate force = &Self::memberMethod<ArgTypes...>;        
    }
};


class class_name {
  template<ArgTypes.. args>
  some_return_type memberMethod(ArgTypes... args) {
    //stuff...
  }

  force_instantation_imlp<class_name, some_return_type, rest_of_types_deduced_from_context> force_virtual_instantation;
}

type_placeholder只是一個“凍結”參數包的幫助模板。

不幸的是,這給了我一個編譯錯誤

error: expected primary-expression before ‘...’ token instate force = &Self::memberMethod<ArgTypes...>;

我猜這個錯誤是因為成員函數是一個可變參數模板。

有沒有辦法在類定義塊中強制使用可變參數模板成員函數實例化?

(重復我對OP的評論。)

line instate force = &Self::memberMethod<ArgTypes...>;的實際問題instate force = &Self::memberMethod<ArgTypes...>; 是一個缺少的template關鍵字:

instate force = &Self::template memberMethod<ArgTypes...>;

請參閱,例如,我必須在何處以及為何要使用“模板”和“typename”關鍵字?

實際上,這里不需要顯式模板參數[over.over] / 1:

在某些上下文中使用不帶參數的重載函數名稱來解析指向過載集中特定函數的成員函數的指針。 函數模板名稱被認為是在這種上下文中命名一組重載函數。 選擇的函數是其類型與上下文中所需的目標類型的函數類型相同的函數。

即,因為instate定義了函數類型,編譯器能夠確定為名稱Self::memberMethod選擇哪個重載( 這里:模板特化)。


可能有更簡單的解決方案來強制實例化函數模板,甚至在類定義中也是如此。 我想到的是使用私有typedef比如using dummy = integral_constant<instate, &Self::memberMethod>; (或static constexpr instate dummy = &Self::memberMethod; )。

我很好,但不是100%確定typedef強制成員函數模板的實例化。 當需要該函數的定義時,函數模板被實例化,並且ODR建議在這里是這樣的情況: “如果它是唯一的查找結果或選擇的,則其名稱顯示為可能被評估的表達式的函數是odr-used一組重載函數的成員“”每個程序應該只包含在該程序中使用的每個非內聯函數或變量的一個定義“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM