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