簡體   English   中英

將模板化的constexpr傳遞給函數來推斷自動對象的類型

[英]Passing templated constexpr to function inferring type of auto object

我正在使用模板元編程制作一個實體組件系統庫,以在編譯時評估簽名位集數據,並允許精確的位集大小,而無需使用#define MAX_COMPONENTS some-number 我正在使用Boost Hana,並具有應如下所示的功能:

template <auto T>
  static constexpr Bitset signatureBitset = Bitset(
    hana::fold(SignatureList[hana::integral_c<std::size_t, signatureID<T>>], 0,
    [](auto l, auto r) {
      return l | 1 << inferProperty<primitiveBit>(r);
    }));

它的作用是為給定簽名計算constexpr位集。 簽名是ECS組件和標簽類型的hana :: tuple_t primitiveBit返回模板參數類型組件/標簽的位偏移量。 由於hana :: fold lambda不提供當前r類型,因此我不能簡單地調用primitiveBit<RType> (未定義RType)。

最簡單的解決方案是編寫每個模板“函數”的副本,但將其作為實際的constexpr函數而不是靜態constexpr對象,但是我試圖避免這樣做,因為編寫30多個重復函數都可以

template <typename T>
static constexpr auto inferFunctionName(hana::basic_type<T> t) {
    return functionName<T>;
}

似乎很愚蠢,會使所有內容難以維護。 上面的代碼看起來也非常簡單,並且可以使用模板函數(將模板constexpr對象作為模板參數)抽象出來。

這是我目前擁有的:

template <template<typename> typename TReturn, typename T>
constexpr auto inferProperty(hana::basic_type<T> t) {
    return TReturn<T>();
}

inferProperty<primitiveBit>(r)拋出編譯錯誤,指出它與定義的模板簽名不匹配。

使用template <template<typename T> typename TReturn, typename T>由於在lambda中未定義T不能選擇template <template<typename T> typename TReturn, typename T>

正如Jack C.在評論中所說,一種簡單的解決方案是在lambda中使用decltype(r)從對象獲取類型,而不是通過模板函數來推斷類型。

這意味着propertyCheck<typename decltype(r)::type>有效。

暫無
暫無

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

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